0

私が取り組んできた単純なレクサー/文法がありますが、フォーマットされた変数を一致させるための標準的な操作手順を理解するのに苦労しています。私は以下を一致させようとしています:

  1. 変数名は最低 1 文字です。1 文字の場合は、大文字または小文字でなければなりません。
  2. 1 文字を超える場合は、大文字と小文字を問わない文字で始まり、その後に数字、アンダースコア、ドル記号を含む任意の数の文字が続く必要があります。

私はこれを何度か、多くのフレーバーで書き直しましたが、常に次のエラーが発生します。

決定は、複数の選択肢を使用して「SINGLELETTER」などの入力に一致させることができます: 1、2

その結果、その入力に対して代替 2 が無効になりました」

いくつかの洞察を本当に感謝します。文法に多少の曖昧さがあることは理解していますが、元の一致ループに入ると、複数の選択肢が一致する理由が少しわかりません。ありがとうございました!

variablename 
    :   (SINGLELETTER)
    |   (SINGLELETTER|UNDERSCORE)( SINGLELETTER|UNDERSCORE | DOLLAR | NUMBER)*;

SINGLELETTER    :   ( 'a'..'z' | 'A'..'Z');


fragment LOWERCASE  :   'a'..'z';
fragment UNDERSCORE :   '_';
fragment DOLLAR :   '$';  
fragment NUMBER :   '0'..'9';
4

1 に答える 1