好的,我对这个错误感到很困惑。我知道在过去有一个'/'作为规则中的标记没有产生任何错误。然而,这简直莫名其妙。这是我的语法:
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是否跳过“/”并且没有将其视为令牌或者我错过了什么?非常感谢任何帮助。
答案 0 :(得分:3)
你的语法没有问题,问题必须是Eclipse插件。 ANTLRWorks的调试器生成树:
自己创建一个小测试(在使用主类和ANTLR 3.3修正错误grammary LilWildC;
到grammar LilWildC;
并删除包之后):
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; } ;
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
不会产生任何错误或警告。