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 )
;
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();
如果我输入“x 5”,我会得到 (VARIABLE_ASSIGNMENT x 5))。如果我输入“x:=5”,我得到 (BLOCK (VARIABLE_ASSIGNMENT x 5)) 如果我输入“x*5”,我得到 (BLOCK ,1:1], resync=x*5>)
即使我将 constnat“字符串”直接发送到 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)。什么。这。地狱。