Eclipse plugin ANTLR在输入端没有可行的替代方案'/';

Eclipse plugin ANTLR在输入端没有可行的替代方案'/';,eclipse-plugin,antlr,antlr3,Eclipse Plugin,Antlr,Antlr3,好吧,我真的对这个错误感到困惑。我知道在过去,在规则中使用“/”作为标记不会产生任何错误。然而,这简直令人困惑。这是我的语法: grammar LilWildC; options { language = Java; } @header { package com.matthewkimber.lilwildc; } @lexer::header { package com.matthewkimber.lilwildc; } program : glob

好吧,我真的对这个错误感到困惑。我知道在过去,在规则中使用“/”作为标记不会产生任何错误。然而,这简直令人困惑。这是我的语法:

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跳过了“/”而没有将其视为标记,还是我遗漏了什么?非常感谢您的帮助。

您的语法没有问题,问题一定是Eclipse插件。ANTLRWorks的调试器生成树:

我自己用一个主类和ANTLR 3.3创建了一个小测试(在将拼写错误
grammary LilWildC;
修改为
grammary LilWildC;
,并删除了包之后):

LilWildC.g
c;
选择权{
语言=Java;
}
程序
:全局变量程序+
;
全局变量
:变量定义*
;
变量定义
:'number'IDENT';'
|“编号”[“A_编号”]“标识”;”
;
p程序
:'procedure'IDENT'{'block'}'
;
块
:局部变量语句+
;
局部变量
:变量定义*
;
陈述
:变量_引用“=”数值_表达式“;”
;
变量参考
:IDENT
|标识符“[”数值表达式“]”
;
数值表达式
:乘法表达式
(“+”乘法_表达式
|“-”乘法表达式
)*
;
乘法表达式
:负系数
(“*”负系数
|“/”负系数
|“%”负_因子
)*
;
负因子
:   '-'? 因素
;
因素
:A_号码
|变量参考
|“(‘数值_表达式’)”
;
A_数:(('0'..'9')+'。?)|(('0'..'9')*'。('0'..'9')+);
识别号:('a'..'z'|'a'..'z')('a'..'z'|'a'..'z'|'0'..'9'|'|')*;
WS:(“”|’\t’|(“\r’?“\n”)+{$channel=HIDDEN;};
主类
import org.antlr.runtime.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
字符串src=
“主程序\n”+
“{\n”+
“var=10/1;\n”+
“}\n”;
LilWildCLexer lexer=新的LilWildCLexer(新的AntlStringStream(src));
LilWildCParser parser=newlilwildcparser(newcommontokenstream(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

不会产生错误或警告。

有趣。eclipse插件这样做有点糟糕。我想这将教会我没有尝试过其他选择,只是信任插件。谢谢你,巴特@马特奥,不客气。很多第三方ANTLR工具都是这样的。当我使用ANTLRWorks时,有些事情并不像我预期的那样进行,我总是在进一步调查之前执行“命令行测试”。