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?
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. –