c - bison 的逗号分隔值的语义

标签 c bison flex-lexer

我试图为逗号分隔值列表赋予语义值。事实上,我已经使用定义了 Bison 的归约规则

commasv : exp
        | commasv "," exp

其中 exp 是一个数字、一个变量或一个函数指针,或者是一个逗号标记及其各自的语法和语义规则。 exp 的类型是 double,因此 commasv 的类型必须是 double。

问题是我想存储该列表以便使用它,例如在函数调用中。例如

h = create_object()
compute_list(h,1,cos(3.14159))

将给出某个compute_list函数的预期结果。

作为基础 bison 文件,我使用了 bison manual 中的 mfcalc 示例。我用生成的另一个函数替换了 yylex 函数 using flex 。现在我可以做类似的事情

pi = 3.14159
sin(pi)
ln(exp(5))

使用带有 flex 的 yylex 函数的修改版本,但我想在函数调用、列表创建等中使用逗号分隔值。

感谢您的回答。

最佳答案

然后创建一个列表来存储结果。commasv 规则的结果不返回实际值,而是返回列表头。

一般来说,一旦你获得了稍微高级的语法(比如它合并了列表之类的东西),你就不能再真正使用值来表示解析,而是必须转向某种abstract syntax tree .

关于c - bison 的逗号分隔值的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14666414/

相关文章:

c - 有没有更简单的方法来获取 char 数组的子字符串并将其转换为 C 中的 long?

c - 在 Linux 上递归列出 C 中的目录

c - mpi 文件读取未结束

c - 为什么我在使用 fprintf 时会出现不一致的行为?

objective-c - 将 Bison/Flex/Yacc 集成到 XCode 中

c++ - 不能在 Qt 上同时使用 Flex 和 Bison

c - Bison-Flex extern FILE *yyin 不工作(C 语言)

c++ - 如何继承yyFlexLexer?

c - 在 Flex 中使用多个缓冲区时,如何避免标记在缓冲区之间拆分

c - 错误:conflicting types for int32_t