Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison 用Flex/Lex识别函数调用模式_Bison_Flex Lexer_Yacc - Fatal编程技术网

Bison 用Flex/Lex识别函数调用模式

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的一个标记,

我正试图编写一个Cminus(C子集)编译器,但我的教授要求我们能够处理
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