2012-02-09 183 views
1

所以我試圖在ANTLR中編寫一個解析器,這是我第一次使用它,我遇到了一個問題,我找不到解決方案,如果這是一個道歉非常簡單的問題。無論如何,我得到的錯誤是:在ANTLR中生成文件時出錯

"(100): Expr.g:1:13:syntax error: antlr: MismatchedTokenException(74!=52)" 

我目前使用的代碼是:

grammar Expr.g; 

options{ 
output=AST; 
} 


tokens{ 
    MAIN = 'main'; 
    OPENBRACKET = '('; 
    CLOSEBRACKET = ')'; 
    OPENCURLYBRACKET = '{'; 
    CLOSECURLYBRACKET = '}'; 
    COMMA = ','; 
    SEMICOLON = ';'; 
    GREATERTHAN = '>'; 
    LESSTHAN = '<'; 
    GREATEROREQUALTHAN = '>='; 
     LESSTHANOREQUALTHAN = '<='; 
    NOTEQUAL = '!='; 
    ISEQUALTO = '=='; 
    WHILE = 'while'; 
    IF = 'if'; 
    ELSE = 'else'; 
    READ = 'read'; 
    OUTPUT = 'output'; 
    PRINT = 'print'; 
    RETURN = 'return'; 
    READC = 'readc'; 
    OUTPUTC = 'outputc'; 
    PLUS = '+'; 
    MINUS = '-'; 
    DIVIDE = '/'; 
    MULTIPLY = '*'; 
    PERCENTAGE = '%'; 
} 


@header { 
//package test; 
import java.util.HashMap; 
} 

@lexer::header { 
//package test; 
} 

@members { 
/** Map variable name to Integer object holding value */ 
HashMap memory = new HashMap(); 
} 

prog: stat+ ; 

stat: expr NEWLINE {System.out.println($expr.value);} 
    | ID '=' expr NEWLINE 
     {memory.put($ID.text, new Integer($expr.value));} 
    | NEWLINE 
    ; 

expr returns [int value] 
    : e=multExpr {$value = $e.value;} 
     ( '+' e=multExpr {$value += $e.value;} 
     | '-' e=multExpr {$value -= $e.value;} 
     )* 
    ; 

multExpr returns [int value] 
    : e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})* 
    ; 

atom returns [int value] 
    : INT {$value = Integer.parseInt($INT.text);} 
    | ID 
     { 
     Integer v = (Integer)memory.get($ID.text); 
     if (v!=null) $value = v.intValue(); 
     else System.err.println("undefined variable "+$ID.text); 
     } 
    | '(' e=expr ')' {$value = $e.value;} 
    ; 

IDENT : ('a'..'z'^|'A'..'Z'^)+ ; : .; 
INT : '0'..'9'+ ; 
NEWLINE:'\r'? '\n' ; 
WS : (' '|'\t')+ {skip();} ; 

感謝您的幫助。

編輯:好吧,我是一個白癡,它只是一個格式錯誤。感謝那些幫助過的人的迴應。

+0

也許你可以嘗試一個極小的語法,然後你的工作方式了。 – 2012-02-09 18:47:22

+0

是的,我認爲如果我找不到這個解決方案,我就必須這樣做。 – djcmm476 2012-02-09 18:55:36

回答

1

你有一些非法字符,您IDENT令牌之後:

IDENT : ('a'..'z'^|'A'..'Z'^)+ ; : .; 

: .;無效那裏。而且您還試圖在詞法規則中混合使用樹重寫操作符^,這是非法的:刪除它們。最後,在您的解析器規則中,您已將它命名爲IDENT,您正在使用ID

它應該是:

ID : ('a'..'z' | 'A'..'Z')+ ; 
+0

它確實有幫助,謝謝。我是一個白癡,那些從我刪除的另一個標記中遺留下來。 – djcmm476 2012-02-09 19:37:42

+0

:)酷,當然歡迎你。 – 2012-02-09 19:38:36