JavaCC识别令牌内的令牌

时间:2014-10-18 14:11:33

标签: java token javacc

我的JavaCC项目有问题。我试图识别一个变量声明,它有一个可能的"变量"前缀,种类和变量的名称(id)。但解析器将第一个单词识别为类型,并且不会继续执行该行的其余部分。

它说:

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");}
}

我还尝试将kind和id放入special_tokens中,然后解析器没有错误,但也没有识别变量声明。

编辑:

这里是输入字符串

start
    char sex
    integer num
end

1 个答案:

答案 0 :(得分:1)

如果你真的想要&#34; char sex&#34;要标记为类VARIABLE的一个标记,那么您需要在VARIABLE s中允许空格。 E.g。

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

但是,我建议您考虑执行以下操作:将VARIABLE规则更改为

<VARIABLE: "variable">

写一个新的非终结

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