0

Maven repo1 から利用可能なランタイムを介して、ANTLR3 を使用しています。

これが私の文法です:

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 を使用してコードを生成しています。

更新: 混乱を避けるために、文法全体を含めました。

4

1 に答える 1

0

たまたまBufferedTokenStreamいつもの代わりに使っていたCommonTokenStream。そのため、ここではチャネルディレクティブが無視されていました。

于 2012-07-03T05:57:13.767 に答える