Antlrには、特定のルールでのみレクサーがトークンを照合できるメカニズムがありますか?
質問
言語にキーワードを追加したい。
このキーワードは、特定のパーサー文法規則の中で一致する必要があります。
下位互換性のため、このキーワードを変数名として引き続き使用できるようにします。つまり、トークンが変数名に適しているかどうかを判断するレクサールールと一致させることができます。
Lexerは、ファイル内で新しいルールが見つかるたびに一致します。
この問題を回避して、IDENTまたは新しいKEYWORDトークンのいずれかに一致するようにvar_declarationルールを変更する適切な方法はありますか?
protected
modified_var_declaration:
VAR (IDENT|KEYWORD);
;
関連するルールは次のとおりです。
IDENT // matches variable names
options { testLiterals=true; }
: ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;
KEYWORD: // my new keyword
"key"
;
変数を作成するためのパーサールールは次のとおりです。
protected
var_declaration:
VAR IDENT;
;
解決
多くの言語には状況依存キーワードがあります。それらを処理する最初のステップは、変数名を表す新しいパーサールール ident
を追加することです。 IDENT
ではなく、パーサーでそのルールを使用します。
ident
: IDENT
| KEYWORD
;
他のヒント
http://www.antlr.org/wiki/displayをご覧ください/ANTLR3/1.+Lexer が役立ちます。 " KEYWORD"の場合、フラグを設定および設定解除する必要があります。許可されます。つまり、
KEYWORD : { keywordcontext }?=> "key";
ここでのコツは、キーワードを期待できる場所を切り替えることです。これは些細なことではありません。
所属していません StackOverflow