【发布时间】:2014-03-21 17:18:37
【问题描述】:
我正在尝试为奇数个空格创建一个令牌。这是我目前拥有的
TOKEN : {
< SPACE: " " >
| < ODDSPACE: <SPACE> ((<SPACE>)(<SPACE>))* >
}
void Start() :
{}
{
<ODDSPACE>
}
这适用于 3、5、7...等空间,但当我尝试仅使用一次空间时会失败。任何想法为什么会发生这种情况?
【问题讨论】:
我正在尝试为奇数个空格创建一个令牌。这是我目前拥有的
TOKEN : {
< SPACE: " " >
| < ODDSPACE: <SPACE> ((<SPACE>)(<SPACE>))* >
}
void Start() :
{}
{
<ODDSPACE>
}
这适用于 3、5、7...等空间,但当我尝试仅使用一次空间时会失败。任何想法为什么会发生这种情况?
【问题讨论】:
请参阅 JavaCC FAQ 的问题 3.3。 http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc3.3
选择使用哪个正则表达式来识别下一个标记有三个黄金法则:
- 正则表达式必须描述剩余输入流的前缀。
- 如果多个正则表达式描述一个前缀,则使用描述输入流最长前缀的正则表达式。 (这称为“最大咀嚼规则”。)
- 如果有多个正则表达式描述了可能的最长前缀,则使用 .jj 文件中第一个出现的正则表达式。
在您的情况下,适用规则 3。你可以将start改写为
void Start() :
{}
{
<ODDSPACE> | <SPACE>
}
【讨论】: