【发布时间】:2012-07-02 18:55:03
【问题描述】:
我正在使用 ANTLR3,通过 Maven repo1 提供的运行时。
这是我的语法:
grammar MiniJavax;
goal : mainClass EOF;
mainClass
: 'class' IDENTIFIER '{' methodDeclarations 'public' 'static' 'void' 'main' '(' ')'
'{' varDeclarations statements '}' '}';
varDeclarations
: varDeclaration varDeclarations | ;
varDeclaration
: type IDENTIFIER ';' ;
methodDeclarations
: methodDeclaration methodDeclarations | ;
methodDeclaration
: 'public' 'static' type IDENTIFIER '(' parameters ')' '{' varDeclarations statements
'return' genExpression ';' '}'
;
parameters
: type IDENTIFIER parameter | ;
parameter
: ',' type IDENTIFIER parameter | ;
type : 'int' | 'boolean';
statements
: statement statements | ;
statement
: '{' statements '}'
| 'if' '(' genExpression ')' statement 'else' statement
| 'while' '(' genExpression ')' statement
| 'System' '.' 'out' '.' 'println' '(' genExpression ')' ';'
| IDENTIFIER '=' genExpression ';';
genExpression
: expression genExpressionRest;
genExpressionRest
: relExpression | ;
expression
: term expressionRest;
expressionRest
: '+' term expressionRest | '-' term expressionRest | ;
term
: factor termRest;
termRest
: '*' factor termRest | ;
factor
: '(' expression ')'
| IDENTIFIER
| IDENTIFIER '(' arguments ')'
| 'true'
| 'false'
| INTEGER;
relExpression
: '==' expression relExpressionRest | '<' expression relExpressionRest;
relExpressionRest
: '&&' relTerm relExpressionRest |;
relTerm
: '==' expression
| '<' expression;
arguments
: genExpression argument | ;
argument
: ',' genExpression argument | ;
IDENTIFIER : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INTEGER : '0'..'9'+
;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
如您所见,我为词法分析器指定了空白字符,并通过 HIDDEN 通道使其对解析器隐藏。
但是,当我尝试解析这个时:
class PrintNumbers {
public static void main() {
int number;
number = 1;
while (number < 11) {
System.out.println(number);
number = number + 1;
}
}
}
我明白了:
line 1:5 extraneous input ' ' expecting IDENTIFIER
我在这里做错了什么?这不应该能解决我的问题吗?
顺便说一句,如果有任何改变,我将使用 ANTLRWorks 生成代码。
更新:为了避免混淆,我已经包含了我的整个语法。
【问题讨论】:
-
为什么那些“:”在语法中的单行?
-
它们应该表示语法中省略了规则:D
-
我发布了整件事。感谢 cmets 人。
-
那么输入呢?显然
class PrintNumbers { : }中的冒号是错误的…… -
我已经把它划掉了,因为它的其余部分似乎与我最初的问题无关,但它现在包括在内。
标签: java parsing antlr whitespace grammar