compiler-construction - 如何使用 JAVACC 中的空词作为标记?
问题描述
我正在使用 JavaCC 设置解析器,我想使用空词作为标记(epsilon 词)
我尝试使用非终端
void Empty() :
{}
{
}
但我收到一个错误
我尝试了一个令牌 < EMPTY : "" > 没有任何效果
我想要一个标记来代表一个空词
解决方案
你想要一个空字符序列的记号还是匹配一个空记号序列的非终结符?
正如JavaCC FAQ 中所解释的,匹配空标记序列的非终结符将是
void Empty() : {}
{
{}
}
JavaCC 语法文件的语法不允许expansion_choices
为空。但是您可以像上面那样放置一个空的 Java 块。
但是,如果您有此非终结符,则Empty()
与 相同{}
。例如,我可以写
void SomeNonterminal() : {}
{
A() B() C()
|
Empty()
}
或者我可以写
void SomeNonterminal() : {}
{
A() B() C()
|
{}
}
这在逻辑上是一样的。
与空字符序列匹配的标记很容易定义
TOKEN: { <EMPTY : ""> }
然而,这可能是个坏主意。如果该标记匹配,那么它将在词法分析器的下一次迭代中再次匹配,并且您将拥有这些标记的无限序列!
唯一有意义的是将词法分析器从一种词法状态带入另一种词法状态。例如
<SOMESTATE> TOKEN: { <EMPTY : ""> : DEFAULT }
推荐阅读
- ionic-framework - 如何在 ionic 3 中实现最新的屏幕方向,因为它没有检测到内置的 onchange 功能?
- r - 使用 ggplot() 覆盖两个线图的问题
- python-3.x - 如何使用python在android设备上通过ADB调用命令?
- tensorflow - 通过深度学习识别场景
- google-drive-api - 您可以通过 REST API 将多个同时分块的文件上传到 Google Drive 吗?
- win32gui - 如何解决未定义的引用,是库没有导入,还是其他问题
- react-native - 我怎样才能毫无问题地将博览会变成原生反应?
- image - 如何在 Flutter 中创建图片区域?
- ios - 错误 | [iOS] 未知:验证期间遇到未知错误(格式错误的版本号字符串“4.0”)
- python - Github API 从 python 请求返回 401,但从 curl 返回 200