0

通常のオブジェクトアクセスのようにトークンを定義した場合:

[$_a-zA-Z]+[.] { return ACCESS; }
[$_a-zA-Z]+    { return ID; }
[+]            { return PLUIS;  }

そして、バイソンの文法規則:

Accesses
    : Accesses ACCESS    { /*do something...*/ }
    | ACCESS             { /*do something...*/ }

Expression    
    : Accesses ID PLUS Accesses ID    { /*do something...*/ }

そのようなコンテンツをソースコードで許可したい:

moduleA.valueB.valueC + valueD

この例では、空のルールを入れないとAccesses、のような単一のID変数valueDは不正です。しかし、空のルールを入れるAccessesと、深刻なS / Rの競合が発生し、一致したテキストが奇妙になります。

そして、ルールを複製するのは良い考えではないと思いますExpression。例:

Expression    
    : Accesses ID PLUS Accesses ID   { /*do something...*/ }
    | ID PLUS Accesses ID            { /*do something...*/ }
    | Accesses ID PLUS ID            { /*do something...*/ }
    | ID PLUS ID                     { /*do something...*/ }

この問題を解決する他の方法を見つけることができますか?

編集:あなたの答えのおかげで、この単純な文法に矛盾がないことに気づきました。少なくとも、本当の問題はどこかに隠れているかもしれないことを私に知らせてください(コンパイラ初心者にとってはなんと混乱なのでしょう!)。

4

2 に答える 2

1

あなたの例でイプシロンプロダクションを使用するだけでも問題はありません。

Expression    
    : Accesses ID PLUS Accesses ID    { /*do something...*/ }
;

Accesses
    : Accesses ACCESS    { /*do something...*/ }
    |                    { /*do something...*/ }
;

競合は発生しません。

于 2012-11-30T00:07:25.813 に答える
1

次のようにできます: lex:

[$_a-zA-Z]+ {return WORD;}
"."         {return DOT;}
"+"         {return PLUS;}

バイソン:

Expression   : Value PLUS Value;
Value        : WORD|WORD AccessList;
AccessElement: DOT WORD;
AccessList   : AccessElement|AccessList AccessElement;
于 2012-11-29T19:44:39.597 に答える