2012-02-09 18 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

たぶん、あなたは非常に最小限の文法を試してみて、そしてあなたの方法を動作することができます。 –

+0

ええ、私はこれについての解決策が見つからなければ、私がしなければならないことだと思います。 – djcmm476

答えて

1

はあなたのIDENTトークンの後、いくつかの不正な文字を持っている:

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

: .;

が無効です。また、ツリー書き換え演算子 ^をレクサールール内に混在させようとしています。これは不正です。それらを削除してください。最後に、 IDENTという名前を付けていますが、パーサーのルールでは IDを使用しています。

それは次のようになります。

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

助けてくれてありがとう。私はばかだ、私は削除した別のトークンから残された。 – djcmm476

+0

:)クール、もちろん歓迎です。 –

関連する問題