javaCC 解析器生成器无法处理 EOF
javaCC parser generator can't handle EOF
这是我从 here 复制的代码(从第 13 页开始;我可以成功执行并解析来自 input.txt 文件的附加示例,其中包含数字和+ 符号在语法上是正确的,即 4 + 2 returns six
,但是 4 ++ 2 gives an error
)
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
正确生成所有必需的 java 文件,所有我编译的文件都没有错误,也没有警告
javac *.java
但是,当我尝试 运行
java Calculator < input.txt
其中 input.txt 包含
4 + 2 + 2
出于某种原因,在这个新版本中我得到了
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)
我该如何解决这个问题?
我找到了解决办法。这是该 PDF 上的一个小错误,我能够解决它。只需添加三个字符即可修复该错误。
答案改成:
void Start(PrintStream printStream) throws NumberFormatException :
{}
{
(
previousValue = Expression()
<EOL>
{printStream.println(previousValue) ; }
)*
<EOF>
}
为了
void Start(PrintStream printStream) throws NumberFormatException :
{}
{
(
previousValue = Expression()
(<EOL>)*
{printStream.println(previousValue) ; }
)*
<EOF>
}
它就像一个魅力。
这是我从 here 复制的代码(从第 13 页开始;我可以成功执行并解析来自 input.txt 文件的附加示例,其中包含数字和+ 符号在语法上是正确的,即 4 + 2 returns six
,但是 4 ++ 2 gives an error
)
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
正确生成所有必需的 java 文件,所有我编译的文件都没有错误,也没有警告
javac *.java
但是,当我尝试 运行
java Calculator < input.txt
其中 input.txt 包含
4 + 2 + 2
出于某种原因,在这个新版本中我得到了
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)
我该如何解决这个问题?
我找到了解决办法。这是该 PDF 上的一个小错误,我能够解决它。只需添加三个字符即可修复该错误。
答案改成:
void Start(PrintStream printStream) throws NumberFormatException :
{}
{
(
previousValue = Expression()
<EOL>
{printStream.println(previousValue) ; }
)*
<EOF>
}
为了
void Start(PrintStream printStream) throws NumberFormatException :
{}
{
(
previousValue = Expression()
(<EOL>)*
{printStream.println(previousValue) ; }
)*
<EOF>
}
它就像一个魅力。