通常のオブジェクトアクセスのようにトークンを定義した場合:
[$_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...*/ }
この問題を解決する他の方法を見つけることができますか?
編集:あなたの答えのおかげで、この単純な文法に矛盾がないことに気づきました。少なくとも、本当の問題はどこかに隠れているかもしれないことを私に知らせてください(コンパイラ初心者にとってはなんと混乱なのでしょう!)。