2

私の Antlr3 文法には、次のような「重複する」レクサー ルールがいくつかあります。

NAT: ('0' .. '9')+ ;
INT: ('+' | '-')? ('0' .. '9')+ ;
BITVECTOR: ('0' | '1')* ;

100110123などのトークンは、これらのルールの複数に一致する可能性がありますが、どのルールにする必要があるかは常にコンテキストによって決定されます。例:

s: a | b | c ;
a: '<' NAT '>' ;
b: '{' INT '}' ;
c: '[' BITVECTOR ']' ;

入力{17}は{INT、および}と一致するはずですが、レクサーは17が NAT トークンであるとすでに判断しています。この動作を防ぐにはどうすればよいですか? バックトラックオプションは既に true に設定されていますが、パーサー ルールにのみ影響するようです。

4

1 に答える 1

3

レクサーを状況依存にする複雑な方法があるかもしれませんが、一般的にはそれがパーサーに処理させ、レクサーにトークンのストリームを提供させたいだけです。私の推奨事項は、レクサーをリファクタリングして戻りDIGITSSIGNパーサーに数字がコンテキストによってどのような数字を表すかを計算させることです。

于 2010-10-11T22:07:58.010 に答える