- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过在Bison文件中包含以下内容,来将GMP库中的mpz_t
类型用作yylval
的类型:
%define api.value.type {mpz_t}
typedef mpz_t YYSTYPE
,随后使用
YYSTYPE
创建了
yylval
。
mpz_t
中,
typedef __mpz_struct mpz_t[1];
被定义为
gmp.h
。依次将
__mpz_struct
定义为
typedef struct
{
// struct members here - don't believe they're important
} __mpz_struct;
yyvsp
被定义为指向
YYSTYPE
的指针。
最佳答案
如您所说,mpz_t
被定义为数组类型的别名:
typedef __mpz_struct mpz_t[1];
mpz_t
类型的变量是非法的:
mpz_t a, b;
mpz_init(b);
a = b; /* Error: incompatible types when assigning to type ‘mpz_t’ */
/* from type ‘struct __mpz_struct *’ */
mpz_t a, b;
mpz_inits(a, b, 0);
mpz_set(a, b); /* a is now a copy of b */
mpz_t
。请参阅下面的注释1。
YYSTYPE
分配给它(请参见注释2),这意味着它不能是数组类型。通常这不是问题,因为通常
YYSTYPE
是联合类型,并且可以将具有数组成员的联合分配给它。因此,只要将数组类型包含在
%union
声明中,就可以将其与bison一起使用。
free
从
mpz_t
下释放内存) 。
mpz_t
对象作为语义值,但这并不容易。您最终将花费大量时间来思考哪些堆栈插槽具有已初始化的语义值。哪些具有需要
mpz_clear
的值以及许多其他麻烦的细节。
mpz_t
的指针。如果您只是制作一个bignum计算器,则可以完全绕开语义值并维护自己的值堆栈。只要每个归约操作从值堆栈中弹出其所有参数并推送其结果,该方法就可以解决。
mpz_t
值的向量,但它在某些重要方面与解析器堆栈不同,因为它完全在您的控制之下:
mpz_add(val_stack[top - 2], val_stack[top - 2], val_stack[top - 1]);
--top;
mpz_t
(和其他类似类型)数组只是为了弥补C缺少传递引用的情况。由于数组在用作函数参数时会衰减为指针,因此无需显式标记参数即可获得引用传递。但是一定有人想过,使用数组类型还会阻止直接分配给
mpz_t
。由于gmp管理内存的方式,直接分配无法工作。
sum += value;
),并且每次通过这样的循环都必须复制
sum
会极大地降低循环速度。
union
hack或使用
memcpy()
来对gmp进行更复杂的重新排列对象,只要您保持重要的不变式:
mpz_t
对象引用。
a
和
b
是
mpz_t
,我们使用一些技巧使它们都成为相同的bignum,共享内存:
memcpy(a, b, sizeof(a));
b
变得更大:
mpz_mul(b, b, b); /* Set b to b squared */
tmp = realloc(b->_mp_d, 2 * b->_mp_size);
if (tmp) b->_mp_d = tmp;
b
足够大以容纳结果。这对于
b
可以正常工作,但是可能会导致
a
指向四肢进入混乱状态,因为成功分配新存储的
realloc
将自动释放旧存储。
b
大小的操作都将发生相同的情况;将其平方就位只是一个例子。在几乎任何会增加
a
:
b
大小的修改之后,
mpz_add(b, tmp1, tmp2);
都可能以悬挂指针结尾(假定
tmp1
和/或
tmp2
大于
b
。)
YYSTYPE
对象;这个临时变量是野牛动作中表示为
$$
的实际变量。在执行归约操作之前,解析器将执行
$$ = $1;
的等效项。操作完成后,将
$1
至
$n
从堆栈中弹出,并将
$$
压入堆栈。实际上,这会用
$1
覆盖旧的
$$
,这就是为什么必须使用临时文件的原因。 (否则,在操作中设置
$$
会使
$1
无效。)
关于c - 尝试将GNU GMP库中的类型用作Bison的yylval类型时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32516093/
我有一个使用 Yacc 编写的语法。语法的相关部分摘录在这里 postfix : primary | postfix '[' expr ']' | postfix '[' ex
如何在 bison/yacc 中使用继承的属性? 说,我有这样的语法 - 程序 -> stmts 我想做的是在 Bison 身上: 程序:stmts {$$.next = newLabel(); $1
有什么方法可以更改 Bison 错误消息的格式?例如,不要说 syntax error, unexpected T_ID, expected ';' or T_IMPORT说 unexpected i
我的语法有这两个标记声明: %token RP %token ELSE 而这两条规则: Statement : IF LP Exp RP Statement; Statement : IF LP
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我希望为现有语言创建一个 JavaScript 解析器,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。我想使用 Jison,并且也一直在尝试学习 Bison 的基础知识。 我不确定如何回
目前我正在研究一个源到源编译器,我已经编写了一个野牛解析器,可以正确地为输入创建 AST。我现在需要对语法树进行多次转换,因此我需要向树中插入许多节点。 我可以手动创建所有要添加到语法树中的结构体/联
如果有一个表单的输入文件: BEGIN stuff.... END BEGIN stuff ... END 我的 .y 文件是这样的 %token BEGIN %token END %star
我正在寻找为现有语言创建 JavaScript 解析器的方法,该语言目前具有笨拙的“手工制作”C# 和 Java 解析器。想用Jison,也在努力学习Bison的基础。 一个我不确定如何回答的问题是
我正在使用 flex/bison 编写解析器(我可以用 Python 编写解析器,但我总是更喜欢经典。) 当我用这个编译代码时: gcc -lfl -ly chance.tab.c lex.yy.c
正在使用 flex/bison 开发编译器。我的构建输出中有此警告。 警告:在默认操作中键入冲突 ('s' '') 请问有什么帮助吗? 最佳答案 它似乎与源中的 %token 和 %type 声明有关
考虑这个 lex.l 文件: %{ #include "y.tab.h" %} digit [0-9] letter [a-zA-Z] %% "+"
我正在为 bison 中的一个简单的 Pascal 编译器编写语法,我想可视化我在 pascal.y 中指定的语法的解析树。是否可以基于我的 pascal.y 文件以图形方式显示语法树? 最佳答案 野
我正在尝试编写一个能够使用以下输入的语法: begin #this is a example x = 56; while x > 0 do begin point 15
我正在尝试使用 BNF 语法编写 Flex/Bison 文件。但是,当我尝试编译时出现错误,而且我不确定如何调试它们。 BNF语法: ::= | head() ::=:: | @ | tail() |
我正在用 Flex/Bison 编写一个小程序来标记/解析我创建的查询语言。 我想知道是否有任何方法可以在 Flex/Bison 中创建任何关键字。 我的意思是:flex 将输入分解成一个标记列表,但
我正在尝试使用 flex 和 bison 创建过滤器,因为我想从复杂的语言中获取某些语法元素。我的计划是使用 flex + bison 来识别语法,并转储出感兴趣元素的位置。 (然后使用脚本根据转储的
我正在尝试实现一个可以进行浮点运算的 Flex/bison 计算器。我的 Flex 代码如下所示 %{ #include "calc.tab.h" #include void yyerror(cha
我正在尝试使用 FLEX 和 BISON 进行一些练习。 这是我写的代码: calc_pol.y %{ #define YYSTYPE double #include "calc_pol.tab.h"
我有一个使用括号和方括号作为分隔符的语法。当由 bison 生成的解析器输入带有不平衡分隔符的输入时,传递给 yyerror 的 YYLTYPE* 中的错误位置是输入的结尾。所以,例如,在输入 x
我是一名优秀的程序员,十分优秀!