2017-09-25 14 views
1

C'est le code que j'ai utilisé et que j'ai copié de here (à partir de la page 13), j'ai pu exécuter et analyser avec succès un exemple d'un fichier input.txt contenant des nombres et + signes sintactically corrects ie 4 + 2 returns six, mais 4 ++ 2 gives an error)Le générateur d'analyseur javaCC ne peut pas gérer EOF

options { 
    STATIC = false ; 
} 

PARSER_BEGIN (Calculator) 
    import java.io.PrintStream ; 

class Calculator 
{ 
    public static void main (String [] args) 
    throws ParseException, TokenMgrError, NumberFormatException 
    { 
     Calculator parser = new Calculator(System.in) ; 
     parser.Start(System.out) ; 
    } 
    double previousValue = 0.0 ; 
} 
PARSER_END (Calculator) 

SKIP : { " " } 
TOKEN : { < EOL : "\n" | "\r" | "\r\n" > } 
TOKEN : { < PLUS : "+" > } 
TOKEN : { < NUMBER : <DIGITS> | <DIGITS> "." <DIGITS> | <DIGITS> "." | "." <DIGITS> > } 
TOKEN : { <#DIGITS : (["0"-"9"])+ > } 

void Start(PrintStream printStream) throws NumberFormatException : 
{} 
{ 
    (
     previousValue = Expression() 
     <EOL> 
     {printStream.println(previousValue) ; } 
    )* 
    <EOF> 
} 

double Expression() throws NumberFormatException : 
{ 
    double i ; 
    double value ; 
} 
{ 
    value = Primary() 
    (
     <PLUS> 
     i = Primary() 
     { value += i ; } 
    )* 
    { return value ; } 
} 

double Primary() throws NumberFormatException : 
{ 
    Token t ; 
} 
{ 
    t = <NUMBER> 
    { return Double.parseDouble(t.image) ; } 
} 

'

C:\Users\Jay\workspace\javaCC>javacc calculator0.jj 

Génère correctement tous les fichiers java nécessaires, tous ceux que je compile sans erreur ni avertissements avec

javac *.java 

Mais, quand je tente d'exécuter

java Calculator < input.txt 

où input.txt contient

4 + 2 + 2

pour une raison quelconque dans cette nouvelle version Je reçois

Exception in thread "main" ParseException: Encountered "<EOF>" at line 1, column 11. 
Was expecting one of: 
    <EOL> ... 
    "+" ... 

     at Calculator.generateParseException(Calculator.java:218) 
     at Calculator.jj_consume_token(Calculator.java:156) 
     at Calculator.Start(Calculator.java:27) 
     at Calculator.main(Calculator.java:10) 

Comment puis-je résoudre ce problème?

+0

La grammaire nécessite une expression par ligne. C'était une décision de conception délibérée. Peut-être que le tutoriel aurait pu mieux expliquer cette décision. –

Répondre

1

J'ai trouvé une solution. C'était un petit bug sur ce PDF et j'étais capable de le résoudre. Seuls trois caractères devaient être ajoutés pour corriger ce bug.

La réponse est de changer:

void Start(PrintStream printStream) throws NumberFormatException : 
{} 
{ 
    (
     previousValue = Expression() 
     <EOL> 
     {printStream.println(previousValue) ; } 
    )* 
    <EOF> 
} 

pour

void Start(PrintStream printStream) throws NumberFormatException : 
{} 
{ 
    (
     previousValue = Expression() 
     (<EOL>)* 
     {printStream.println(previousValue) ; } 
    )* 
    <EOF> 
} 

Et cela fonctionne comme un charme.

+0

Le mot "bug" semble un peu dur. :-) –

+0

Oui. Le seul problème avec cela est que 'Expression's peuvent se suivre sans aucun' 'entre eux; ce n'était pas autorisé dans la version originale. –