ANTLR在输入'/'时没有可行的选择

时间:2011-07-29 04:52:51

标签: eclipse-plugin antlr antlr3

好的,我对这个错误感到很困惑。我知道在过去有一个'/'作为规则中的标记没有产生任何错误。然而,这简直莫名其妙。这是我的语法:

grammar LilWildC;

options {
    language = Java;
}

@header
{
    package com.matthewkimber.lilwildc;
}

@lexer::header
{
    package com.matthewkimber.lilwildc;
}

program
    :   global_variables procedure+
    ;

global_variables
    :   variable_definition*
    ;

variable_definition
    :   'number' IDENT ';'
    |   'number' '[' A_NUMBER ']' IDENT ';'
    ;

procedure
    :   'procedure' IDENT '{' block '}'
    ;

block
    :   local_variables statement+
    ;

local_variables
    :   variable_definition*
    ;

statement
    :   variable_reference '=' numeric_expression ';'
    ;

variable_reference
    :   IDENT
    |   IDENT '[' numeric_expression ']'
    ;

numeric_expression
    :   multiply_expression
        ( '+' multiply_expression
        | '-' multiply_expression
        )*
    ;

multiply_expression
    :   negative_factor
        ( '*' negative_factor
        | '/' negative_factor
        | '%' negative_factor
        )*
    ;

negative_factor
    :   '-'? factor
    ;

factor
    :   A_NUMBER
    |   variable_reference
    |   '(' numeric_expression ')'
    ;

A_NUMBER:   (('0'..'9')+'.'?) | (('0'..'9')*'.'('0'..'9')+) ;
IDENT:  ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* ;
WS: (' ' | '\t' | ('\r'?'\n'))+ { $channel = HIDDEN; } ;

当我使用以下输入对语法进行测试时:

procedure main
{
    var = 10 / 1;
}

我在ANTLR eclipse插件中获得了以下解析树:

ANTLR Parse Tree - NoViableAltException

我没有得到的是乘法和模运算正常,只有除法抛出这个错误。 ANTLR是否跳过“/”并且没有将其视为令牌或者我错过了什么?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

你的语法没有问题,问题必须是Eclipse插件。 ANTLRWorks的调试器生成树:

enter image description here

自己创建一个小测试(在使用主类和ANTLR 3.3修正错误grammary LilWildC;grammar LilWildC;并删除包之后):

LilWildC.g

grammar LilWildC;

options {
    language = Java;
}

program
    :   global_variables procedure+
    ;

global_variables
    :   variable_definition*
    ;

variable_definition
    :   'number' IDENT ';'
    |   'number' '[' A_NUMBER ']' IDENT ';'
    ;

p    rocedure
    :   'procedure' IDENT '{' block '}'
    ;

block
    :   local_variables statement+
    ;

local_variables
    :   variable_definition*
    ;

statement
    :   variable_reference '=' numeric_expression ';'
    ;

variable_reference
    :   IDENT
    |   IDENT '[' numeric_expression ']'
    ;

numeric_expression
    :   multiply_expression
        ( '+' multiply_expression
        | '-' multiply_expression
        )*
    ;

multiply_expression
    :   negative_factor
        ( '*' negative_factor
        | '/' negative_factor
        | '%' negative_factor
        )*
    ;

negative_factor
    :   '-'? factor
    ;

factor
    :   A_NUMBER
    |   variable_reference
    |   '(' numeric_expression ')'
    ;

A_NUMBER:   (('0'..'9')+'.'?) | (('0'..'9')*'.'('0'..'9')+) ;
IDENT:  ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9' | '_')* ;
WS: (' ' | '\t' | ('\r'?'\n'))+ { $channel = HIDDEN; } ;

Main.java

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    String src = 
        "procedure main     \n" +
        "{                  \n" +
        "    var = 10 / 1;  \n" +
        "}                  \n";
    LilWildCLexer lexer = new LilWildCLexer(new ANTLRStringStream(src));
    LilWildCParser parser = new LilWildCParser(new CommonTokenStream(lexer));
    parser.program();
  }
}
bart@hades:~/Programming/ANTLR/Demos/LilWildC$ java -cp antlr-3.3.jar org.antlr.Tool LilWildC.g
bart@hades:~/Programming/ANTLR/Demos/LilWildC$ javac -cp antlr-3.3.jar *.java
bart@hades:~/Programming/ANTLR/Demos/LilWildC$ java -cp .:antlr-3.3.jar Main

不会产生任何错误或警告。