2014-10-18 178 views
1

我的JavaCC项目出现了一些问题。我试图识别一个变量声明,它有一个可能的“变量”前缀,一种变量名称和变量(id)。但解析器将第一个单词识别为kind,并且不会继续执行该行的其余部分。JavaCC在令牌中识别令牌

它说:

Exception in thread "main" ParseException: Encountered " <KIND> "char "" at line 2, column 9. 
Was expecting one of: 
<VARIABLE> ... 

这里是我的令牌如何申报

TOKEN : 
{ 
    <START: "start"> {debugStream.println("start");} 
    | <END: "end"> {debugStream.println("end");} 
    | <VARIABLE: ("variable" <KIND> <ID>) | (<KIND> <ID>)> {debugStream.println("variable decl");} 
    | <KIND: "integer"|"real"|"logic"|"char"|"text"> {debugStream.println("kind");} 
    | <ID: (["a"-"z","_"])+> {debugStream.println("id");} 
} 

我也试图把种类和ID为special_tokens,然后解析器不用错误,但不要也不承认变量声明。

编辑:

这里的输入字符串

start 
    char sex 
    integer num 
end 
+0

你没有说什么定义'TYPE'。你也可以显示输入字符串。 – 2014-10-18 17:58:01

+0

对不起@TheodoreNorvell。我已编辑帖子以添加输入字符串。这是一个非常简单的。没有TYPE,它只是一个错字。 – bfagundes 2014-10-18 22:01:19

回答

1

如果你真的想要的“焦炭性”来标记作为一种VARIABLE一个令牌,那么你需要允许VARIABLE小号空间。例如。

<VARIABLE: ("variable" (" ")+ <KIND> (" ")+ <ID>) | (<KIND> (" ")+ <ID>)> 

不过,我建议你考虑执行下列操作:更改VARIABLE规则

<VARIABLE: "variable"> 

写一个新的非终结

void variable() : {} { 
    <VARIABLE> <KIND> <ID> 
| 
    <KIND> <ID> 
}