我正在用Yacc编写一个编译器,并且无法弄清楚如何编写产品以匹配函数。在我的语言中,函数定义如下:
function foo(a, b, c);
我创建了lex模式以将单词功能与FUNC匹配,并将任何C样式名称与NAME匹配。
理想情况下,我想要这样的事情:
FUNC NAME OBRACKET NAME (COMMA NAME)* CBRACKET
在NAME和CBRACKET之间允许使用一对未知数量的COMMA NAME。
另外,我怎么知道发现了多少?
答案 0 :(得分:1)
您可以尝试这样的事情:
funcdecl: FUNC NAME OBRACKET arglist CBRACKET SEMI
;
arglist: nonemptyarglist
|
;
nonemptyarglist: nonemptyarglist COMMA NAME
| NAME
;
我建议使用语法为您的语言构建语法树,然后在解析完成后对语法树执行任何操作。 Bison和yacc具有相当简单的功能;在信息页面中查找%union
和%type
。
答案 1 :(得分:0)
经过一些实验,我发现这很有效:
int argCount;
int args[128];
arglist: nonemptyarglist
|
;
nonemptyarglist: nonemptyarglist COMMA singleArgList
| singleArgList
{
};
singleArgList:
REGISTER
{
args[argCount++] = $1;
};