1

我正在使用 Yacc 编写编译器,但无法弄清楚如何编写产品来匹配函数。在我的语言中,函数是这样定义的:

function foo(a, b, c);

我创建了 lex 模式以将单词 function 与 FUNC 匹配,并将任何 C 样式名称与 NAME 匹配。

理想情况下,我想要这样的东西:

FUNC NAME OBRACKET NAME (COMMA NAME)* CBRACKET

这将允许在 NAME 和 CBRACKET 之间存在一些未知数量的 COMMA NAME 对。

另外,我怎么知道它找到了多少?

4

2 回答 2

1

你可以尝试这样的事情:

funcdecl: FUNC NAME OBRACKET arglist CBRACKET SEMI
;

arglist: nonemptyarglist
       |
;

nonemptyarglist: nonemptyarglist COMMA NAME
               | NAME
;

我建议使用语法为您的语言构建语法树,然后在解析完成后对语法树执行任何您需要的操作。Bison 和 yacc 的特性使这变得相当简单。查找%union%type在信息页面中。

于 2012-11-26T08:41:14.307 回答
0

经过一些实验,我发现这个效果很好:

int argCount;
int args[128];

arglist: nonemptyarglist
       |
        ;

nonemptyarglist: nonemptyarglist COMMA singleArgList
               | singleArgList
        {

        };

singleArgList:
            REGISTER
        {
            args[argCount++] = $1;
        };
于 2012-11-26T12:54:08.483 回答