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 を使用してコードを生成しています。
更新: 混乱を避けるために、文法全体を含めました。