【问题标题】:JavaCC recognise token within tokenJavaCC 识别令牌内的令牌
【发布时间】:2014-10-18 14:11:33
【问题描述】:

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

上面写着:

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

【问题讨论】:

  • 你没有说TYPE的定义是什么。你也可以请显示输入字符串。
  • 对@TheodoreNorvell 感到抱歉。我已经编辑了帖子以添加输入字符串。这是一个非常简单的。而且没有 TYPE 只是一个错字。

标签: java token javacc


【解决方案1】:

如果你真的想将“char sex”标记为一种VARIABLE 的标记,那么你需要在VARIABLEs 中允许空格。例如

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

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

<VARIABLE: "variable">

写一个新的非终结符

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多