JavaCC集成文件
我正在使用JavaCC构建一个lexer和一个解析器,我有以下代码:JavaCC集成文件,javacc,Javacc,我正在使用JavaCC构建一个lexer和一个解析器,我有以下代码: TOKEN: { < #DIGIT : [ "0"-"9" ] > |< INTEGER_LITERAL : (<DIGIT>)+ > } SimpleNode IntegerLiteral() : { Token t; } { (t=<INTEGER_LITERAL>) { Integer n = new Integer(t.image); j
TOKEN:
{
< #DIGIT : [ "0"-"9" ] >
|< INTEGER_LITERAL : (<DIGIT>)+ >
}
SimpleNode IntegerLiteral() :
{
Token t;
}
{
(t=<INTEGER_LITERAL>)
{
Integer n = new Integer(t.image);
jjtThis.jjtSetValue( n );
return jjtThis;
}
}
令牌:
{
<#数字:[“0”-“9”]>
|
}
SimpleNode IntegerLiteral():
{
令牌t;
}
{
(t=)
{
整数n=新整数(t.image);
jjtThis.jjtSetValue(n);
将此返回jjt;
}
}
因此,它应该只接受整数,但也接受4。或4%%%等。尝试在解析器规范文件中启用调试,如:
OPTIONS {
DEBUG_TOKEN_MANAGER=true
}
这将创建TokenManager在解析时正在执行的操作的打印输出。“4.”和“4%%%”实际上不被接受,因为解析器读取的内容始终是“4”
如果将DEBUG_PARSER设置为true;在选项部分,您将看到当前读取的令牌。
我认为,如果您像这样更改语法,您可以看到它在读取未处理的字符时抛出一个错误
SimpleNode IntegerLiteral() :
{
Token t;
}
{
(
t=<DIGIT>
{
Integer n = new Integer(t.image);
jjtThis.jjtSetValue( n );
return jjtThis;
})+
}
SimpleNode IntegerLiteral():
{
令牌t;
}
{
(
t=
{
整数n=新整数(t.image);
jjtThis.jjtSetValue(n);
将此返回jjt;
})+
}
如果IntegerLiteral
是解析器的开始符号,则需要在t=之后添加
,当我添加时,它表示预期EOF,不接受其他输入。我认为您需要更清楚地说明希望解析器识别的语言。到目前为止,我们知道“4”在语言中,但“4”和“4%%”不是。此外,该语言包含的内容不限于()+
。没什么大不了的,你什么意思?整数本身应该是有效的,但我的意思是你的问题不清楚,因为你还没有明确说明需要接受哪一组字符串。请重写问题,使其更清楚地说明什么应该和不应该被接受。