2012-07-02 55 views
0

我正在使用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:爲了避免混淆,我已經包括了我的整個語法。

+0

爲什麼這些「:」在語法單行? – leonbloy

+0

他們應該表示在語法中省略了規則:D –

+0

我發佈了整個事情。感謝評論人。 –

回答

0

碰巧我正在使用BufferedTokenStream而不是通常的CommonTokenStream。這就是爲什麼頻道指令在這裏被忽略。

+1

很好的你發佈的解決方案。在這裏,你看到張貼包含自包含的代碼示例問題的重要性:你的問題現在站立,不可能給別人看的是什麼問題,因爲你沒有提供包含使用'BufferedTokenStream'的驅動程序類。 –