ANTLRが何らかの理由でトークンを無視する理由はありますか?これが相対コードです。var_assignを直接呼び出しています。
LABEL
: LETTER (LETTER | DIGIT | '_')*;
fragment LOWER_CASE
: 'a'..'z';
fragment UPPER_CASE
: 'A'..'Z';
fragment LETTER
: UPPER_CASE | LOWER_CASE;
public var_assign
: LABEL ':=' expression -> ^( VARIABLE_ASSIGNMENT LABEL expression )
;
式は、NUMBERやLABEL(変数の場合)などのトークンで終わる式の標準チェーンです。
ここでの問題は、「何でも」と入力するだけで、パーサーがそれを割り当てとして認識することです。
ANTLRStringStream Input = new ANTLRStringStream(input_to_process);
processor.lexer.ConsoleGrammarLexer Lexer = new processor.lexer.ConsoleGrammarLexer(Input);
CommonTokenStream Tokens = new CommonTokenStream(Lexer);
processor.parser.ConsoleGrammarParser Parser = new processor.parser.ConsoleGrammarParser(Tokens);
CommonTree start_rule_tree = Parser.var_assign().Tree;
//view the tree to help debug
processor_output = start_rule_tree.ToStringTree();
「x5」と入力すると、(VARIABLE_ASSIGNMENT x 5))が得られます。「x:= 5」と入力すると、(BLOCK(VARIABLE_ASSIGNMENT x 5))が得られます。「x * 5」と入力すると、(BLOCK、1:1]、resync = x * 5>)が得られます。
これは、constnat"string"をANTLRStringStreamに直接送信した場合でも発生します。
':='を(':=' |'anythinghere')または(':=')*に置き換えることで、これを解決することができました。しかし、他にも奇妙な振る舞いがあります。
言語オプションとしてCSharp3を使用しており、最新の.dllを使用しています。
何が起こっているのか、これはまったく意味がありません。
編集:
テスト文法を作成しました。
grammar testgrammar;
options {
language = CSharp3;
output = AST;
TokenLabelType = CommonToken;
ASTLabelType = CommonTree;
}
LABEL : 'a'..'z';
WS : ' ' {Skip();};
public start
: if_statement EOF!;
if_statement
: LABEL ':=' LABEL ->^(LABEL LABEL);
「ff」と入力すると(ff)が生成され、f * fと入力すると実行時エラーが生成され、f:= fと入力すると(ff)が生成されます。何。。地獄。