我正在用java cc编写一个程序,我正在编写一个编译器。我已经在.jj文件中编写了一个代码,我已经定义了令牌和解析器,但是在文件的末尾,程序发出错误,不知道为什么。请帮我解决这个问题。
void Start () : {}
{
(
INTEGER_CONSTANT
| STRING_CONSTANT
| LOGIC_CONSTANT
| NOT
| IF
| END
| SUB
| LET
| CALL
| THEN
| CASE
| ELSE
| INPUT
| PRINT
| SELECT
| STATIC
| IDENTIFIER
)*
<EOF>
}
我有以下错误:
org.javacc.parser.ParseException:遇到“ “INTEGER_CONSTANT”“|” “|”“STRING_CONSTANT”“|” “| “”LOGIC_CONSTANT“”|“”| “”不是“”|“ “|”“IF”“|” “|”“结束”“|” “|” “SUB”“|” “|”“LET”“|” “|” “打电话”“|” “|”“那么”“|” “|” “CASE”“|” “|”“ELSE”“|” “|” “输入”“|” “|”“打印”“|” “|” “SELECT”“|” “|”“STATIC”“|” “|” “IDENTIFIER”“)”“)”“”“”“在第91行第7行。
答案 0 :(得分:1)
假设您具有解析器方法中使用的所有标记(在词法规范部分中)的有效声明,则需要在尖括号内使用这些标记。见下文
void Start () : {}
{
(
<INTEGER_CONSTANT>
| <STRING_CONSTANT>
| <LOGIC_CONSTANT>
| <NOT>
| <IF>
| <END>
| <SUB>
| <LET>
| <CALL>
| <THEN>
| <CASE>
| <ELSE>
| <INPUT>
| <PRINT>
| <SELECT>
| <STATIC>
| <IDENTIFIER>
)*
<EOF>
}
JavaCC解析器规则声明:
1。)直接字符串:
在这种情况下,您可以直接在解析器定义方法中使用该字符串,但这需要包含在double_quotes中。
void start() : {}
{ "a" }
2。)使用词法规范部分中定义的令牌:
这里使用需要包含在尖括号内的词法标记来定义规则。
TOKEN:{
< A : "a" >
}
void start() : {}
{ <A>}
3。)使用内联令牌定义:
在这里,我们可以在解析器规则定义中声明令牌。这是合法的,但会使语法的可读性降低。
void start() : {}
{ <A : "a" >}
4。)通过调用另一个解析器规则:
我们也可以通过调用下面的另一条规则来定义规则。
void start() : {}
{ A() }
void A() : {}
{ "a" }
希望这会有用......
答案 1 :(得分:-1)
也许是因为您使用了(...)*
而且可能是(...)+
因为*
您说的是0次或多次。我认为这就是错误的原因。