1

Yacc を使用してコンパイラを作成していますが、関数に一致するプロダクションを作成する方法がわかりません。私の言語では、関数は次のように定義されています。

function foo(a, b, c);

function という単語を FUNC に、C スタイルの名前を NAME に一致させる lex パターンを作成しました。

理想的には、次のようなものが必要です。

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 に答える