Yacc - 匹配功能的制作

时间:2012-11-26 08:05:52

标签: regex compiler-construction yacc

我正在用Yacc编写一个编译器,并且无法弄清楚如何编写产品以匹配函数。在我的语言中,函数定义如下:

function foo(a, b, c);

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

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

FUNC NAME OBRACKET NAME (COMMA NAME)* CBRACKET

在NAME和CBRACKET之间允许使用一对未知数量的COMMA NAME。

另外,我怎么知道发现了多少?

2 个答案:

答案 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;
        };