1

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)。什么。这。地狱。

4

1 回答 1

1

Java 版本提供:

/tmp $ java TestT
ff
line 1:2 no viable alternative at character '\n'
line 1:1 missing ':=' at 'f'

从:

    InputStream is = System.in;
    if ( inputFile!=null ) {
        is = new FileInputStream(inputFile);
    }
    CharStream input = new ANTLRInputStream(is);

    TLexer lex = new TLexer(input);

    CommonTokenStream tokens = new CommonTokenStream(lex);
    TParser parser = new TParser(tokens);

    parser.start();

不知道怎么了。CSharp3 也应该可以工作。我很困惑。启动调试器并设置断点。这是你唯一的希望,卢克!

于 2012-07-22T16:06:49.880 回答