我正在使用ANTLR3,通過Maven repo1提供的運行時。使用ANTLR正確檢測空格
這裏是我的語法:對於詞法分析器
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; } ;
正如你所看到的,我已指定空格字符,並取得了隱藏它通過隱藏通道分析器。
然而,當我試圖解析此:
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生成代碼,如果這改變了任何東西。
UPDATE:爲了避免混淆,我已經包括了我的整個語法。
爲什麼這些「:」在語法單行? – leonbloy
他們應該表示在語法中省略了規則:D –
我發佈了整個事情。感謝評論人。 –