トークンレベルであいまいな言語を認識できるパーサーをJavaCCに書き込もうとしています。この特定のケースでは、言語は、除算演算子として "/"トークンを単独でサポートしますが、正規表現リテラルもサポートします。次のコードを考えるとJavaCCでのトークンのあいまいさの処理
TOKEN :
{
...
< VAR : "var" > |
< DIV : "/" > |
< EQUALS : "=" > |
< SEMICOLON : ";" > |
...
}
TOKEN :
{
< IDENTIFIER : <IDENTIFIER_START> (<IDENTIFIER_START> | <IDENTIFIER_CHAR>)* > |
< #IDENTIFIER_START : ([ "$","_","A"-"Z","a"-"z" ])> |
< #IDENTIFIER_CHAR : ([ "$","_","A"-"Z","a"-"z","0"-"9" ]) > |
< REGEX_LITERAL : ("/" <REGEX_BODY> "/" (<REGEX_FLAGS>)?) > |
< #REGEX_BODY : (<REGEX_FIRST_CHAR> <REGEX_CHARS>) > |
< #REGEX_CHARS : (<REGEX_CHAR>)* > |
< #REGEX_FIRST_CHAR : (~["\r", "\n", "*", "/", "\\"] | <BACKSLASH_SEQUENCE>) > |
< #REGEX_CHAR : (~[ "\r", "\n", "/", "\\" ] | <BACKSLASH_SEQUENCE>) > |
< #BACKSLASH_SEQUENCE : ("\\" ~[ "\r", "\n"]) > |
< #REGEX_FLAGS : (<IDENTIFIER_CHAR>)* >
}
:トークンの
var y = a/b/c;
二つの異なるセットを生成することができ
は、次のJavaCCの文法を考えてみましょう。トークンストリームのいずれかでなければなりません:
<VAR> <IDENTIFIER> <EQUALS> <IDENTIFIER> <DIV> <IDENTIFIER> <DIV> <SEMICOLON>
または
<VAR> <IDENTIFIER> <EQUALS> <IDENTIFIER> <REGEX_LITERAL> <SEMICOLON>
どのように私はそれTokenManagerが、私はこのような場合のために期待するトークンストリームを生成することを保証することができますか?限り、私は(私はいつか戻ったJavaCCで働いていた)覚えて