私はANTLRの新しいリーンです。 ANTLRを使用して2つのJAVAファイルをコンパイルするときも同じエラーが発生しました。木は欠陥のない葉でよく見える。私はこのエラーの根本原因の手がかりを見つけることができません。 使用しているANTLRのバージョンは「ANTLR 4」です。 誰かがそれを修正する方法を知っていますか?前もって感謝します!ANTLRエラー:入力 '<EOF>'で実行可能な代替案がありません。それを修正するには?
1)ANTLRファイルとして以下test.g4ある、
grammar test;
// Syntax Specification ==> Context-free Grammar
pa1:
mainClass aClass*;
mainClass:
classDeclaration '{' mainDeclaration ('{'body'}'|'{''{'body'}''}') '}';
mainDeclaration:
'public' 'static' 'void' 'main' '(' 'String''['']' ID ')';
aClass:
classDeclaration '{' body '}';
classDeclaration:
'class' ID;
aMethod:
methodDeclaration'{'body'}';
methodDeclaration:
type ID'('parameterList')';
body:
(varDeclaration|statement|expression|aMethod)*;
varDeclaration:
type ID ';' ;
statement:
(ID|arrayElement) '=' (NUM|ID|string|aChar|('new' type)? arrayElement|'new' (type|ID) '('')'|aCall|mathExpression)';'; //(ID|arrayElement) '=' (NUM|ID|string|aChar|arrayElement|aCall|mathExpression|booleanExpression)';';
string:
'"' .*? '"';
aChar:
'\''(.?|'+'|'-')'\'';
expression:
ID';'|whileExpression|ifExpression|sysPrintExpression|returnExpression;
ifExpression:
'if''('booleanExpression')' ((varDeclaration|statement|expression)*|'{'(varDeclaration|statement|expression)*'}')
('else''if''('booleanExpression')' ((varDeclaration|statement|expression)*|'{'(varDeclaration|statement|expression)*'}'))?
('else'((varDeclaration|statement|expression)*|'{'(varDeclaration|statement|expression)*'}'))?;
whileExpression:
'while''('booleanExpression')' '{'(varDeclaration|statement|expression)*'}';
sysPrintExpression:
'System''.''out''.''println''('(NUM|arrayElement|aCall)')'';';
returnExpression:
'return'(NUM|ID)';';
compExpression:
(ID|NUM|mathExpression) COMPOPERATOR (ID|NUM|'('mathExpression')'|'('ID')');
mathExpression:
(ID|NUM) (PLUS|MINUS|MULT|DIV)(ID|NUM|('('ID'.'ID'('parameterList')'')'));
singleBooleanExpression:
'!'?('('compExpression')'|compExpression|aCall|ID);//(LOGICALOPERATOR('!'?(compExpression|aCall|ID|string|aChar)))?;
doubleBooleanExpression:
'(''!'?('('compExpression')'|compExpression|aCall|ID)')'LOGICALOPERATOR('(''!'?(compExpression|aCall|ID|string|aChar)')');
booleanExpression:
singleBooleanExpression|doubleBooleanExpression;
aCall:
(ID|'new'? ID '('')')calling|'('(ID|ID'('')')calling')'calling;
calling:
'.'(ID('('parameterList')')?);
parameterList:
(NUM|type? ID|aChar|string|mathExpression|aCall)?(','(NUM|type? ID|aChar|mathExpression))*;
arrayElement:
ID?'['(ID|NUM)']';
type:
'int''['']'|'boolean'|'int'|'char'|ID;
// Lexer Specification ==> Regular Expressions
NUM: ('0' | [1-9][0-9]*);
ID: [a-zA-Z_][0-9a-zA-Z_]*;
PLUS : '+' ;
MINUS : '-' ;
MULT : '*' ;
DIV : '/';
COMPOPERATOR: '<'|'>';
LOGICALOPERATOR: '=='|'||'|'&&';
WHITESPACE: [ \t\r\n]+ -> skip;
COMMENT: ('/*'.*?'*/'|'//'~[\r\n|\r|\n]*) -> skip;
2)JAVAのFILE1は、以下のようMyChar.java、
class MyChar{
public static void main(String[] a){
{
System.out.println(new CharEditor().whichIsSmaller('a', 'c'));
System.out.println(new CharEditor().whichIsSmaller('a', 'A'));
System.out.println(new CharEditor().whichIsSmaller('1', 'd'));
System.out.println(new CharEditor().whichIsSmaller('-', '+'));
// System.out.println("There are total " + new MyChar().countFromCharToChar('a', 'z', true) + " characters in between a and z");
System.out.println(new CharEditor().countChars("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 'c'));
}
}
}
class CharEditor {
char whichIsSmaller(char firstChar, char secondChar){
char returnChar;
if(secondChar < firstChar) //the comparison is based on the character's ASCII code
returnChar = firstChar;
else
returnChar = secondChar;
return returnChar;
}
int countChars(String str, char c){
int n;
int sz;
char c1;
int counter;
counter = 0;
sz = str.length();
n = 0;
while (n < sz) {
c1 = str.charAt(n);
if (c1 == c) {
counter = counter + 1;
}
n = n + 1;
}
return counter;
}
}
3である)は、Java FILE2は以下の通りであるMyString.java 、
class MyString{
public static void main(String[] a){
{
System.out.println(new StringEditor().removeSpace("Hello World And Happy Coding"));
System.out.println(new StringEditor().containsChar("Hello World And Happy Coding", 'd'));
System.out.println(new StringEditor().containsChar("Hello World And Happy Coding", 'b'));
}
}
}
class StringEditor {
String removeSpace(String str) {
String toReturn;
int n;
int sz;
char c;
toReturn = "";
sz = str.length();
n = 0;
while (n < sz) {
c = str.charAt(n);
if (c == ' ') {
} else {
toReturn = toReturn + c;
}
n = n+1;
}
return toReturn;
}
boolean containsChar(String str, char c) {
int n;
int sz;
char c1;
boolean toReturn;
toReturn = false;
sz = str.length();
n = 0;
while (n < sz) {
c1 = str.charAt(n);
if (c1 == c) {
toReturn = true;
break;
}
n = n+1;
}
return toReturn;
}
}
については、ファイル1、文法>
をダウンロード - Javaの行く準備がありますがfrom the Antlr site は文法ルール 'type'に' String'がないので、行26のint countChars(String str、char c){'をパースできません。また、 '=='を 'LOGICALOPERATOR'から' COMPOPERATOR'に移動してください。 – BernardK
ありがとうBernard!それはファイル1のために働いています。あなたによって啓発され、私はファイル2のためにそれを解決しました。 –