Bison 用Flex/Lex识别函数调用模式
我正试图编写一个Cminus(C子集)编译器,但我的教授要求我们能够处理Bison 用Flex/Lex识别函数调用模式,bison,flex-lexer,yacc,Bison,Flex Lexer,Yacc,我正试图编写一个Cminus(C子集)编译器,但我的教授要求我们能够处理input()和output()函数作为系统调用(上学期我们实现了一个RISC CPU,可以处理这些指令) 对于输入()。因为这个函数应该以数组或变量作为参数,所以我假设在Lex模式上,我需要这样的东西(参考我读到的内容): 但我的语法有以下定义: type: INT | VOID; fun_decl: type ID LPAREN params RPAREN comp_decl; 其中ID是Lex给Bison的一个标记,
input()
和output()
函数作为系统调用(上学期我们实现了一个RISC CPU,可以处理这些指令)
对于输入()。因为这个函数应该以数组或变量作为参数,所以我假设在Lex模式上,我需要这样的东西(参考我读到的内容):
但我的语法有以下定义:
type: INT | VOID;
fun_decl: type ID LPAREN params RPAREN comp_decl;
其中ID是Lex给Bison的一个标记,当它匹配字符串到identificator
我的问题是只有fun\u decl
被匹配,但我离题了
总之,如何将output(var)
或output(array[I])
与模式匹配?有可能吗
编辑1:
在阅读了@rici的回复后,我成功地为制作提供了这段代码,将所有内容从Lex/Flex中移开,只处理Bison YACC(代码的其余部分为清晰起见):
那么数组[0]
或数组[1]
呢?允许吗?我看不出匹配有多有趣,因为这里没有指定返回类型-我猜您的语法中也有函数调用定义,它肯定会匹配吗
单函数调用语法定义应该足够了,我不确定您为什么要将输入
/输出
函数硬编码到语法中。鉴于您有一个产品来识别函数声明:
fun_decl: type ID LPAREN params RPAREN comp_decl;
您将有一个产品来识别函数调用,这似乎是合理的:
expr : /* ... */
| ID LPAREN arguments RPAREN
arguments: /* empty */
| exprs
exprs : expr
| exprs COMMA expr
这包括语法部分。试图在lexer中执行这些操作违反了词法分析和解析之间的明确区别,您可能需要对此进行回顾。(此外,正如您所发现的,这将证明是不可行的。)
在语义操作中,需要检查函数调用中的ID
是什么,如果是系统调用,则插入适当的代码。这是解析器的工作,而不是词法分析器的工作。太广泛了。我确实有一个函数调用的产品,我只是不认为它在这里有用。但正如你所建议的那样,这可能是唯一的方法。如果你想看的话,我已经添加了我在原始帖子中提出的代码。非常感谢你的帮助。@pedro:我觉得这很合适。
fun_decl: type ID LPAREN params RPAREN comp_decl;
expr : /* ... */
| ID LPAREN arguments RPAREN
arguments: /* empty */
| exprs
exprs : expr
| exprs COMMA expr