Antlrには、特定のルールでのみレクサーがトークンを照合できるメカニズムがありますか?

StackOverflow https://stackoverflow.com/questions/1620011

  •  06-07-2019
  •  | 
  •  

質問

言語にキーワードを追加したい。

このキーワードは、特定のパーサー文法規則の中で一致する必要があります。

下位互換性のため、このキーワードを変数名として引き続き使用できるようにします。つまり、トークンが変数名に適しているかどうかを判断するレクサールールと一致させることができます。

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";

ここでのコツは、キーワードを期待できる場所を切り替えることです。これは些細なことではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top