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时,有些事情并不像我预期的那样进行,我总是在进一步调查之前执行“命令行测试”。