令牌为奇数个空格

时间:2014-03-21 17:18:38

标签: token lexer javacc

我正在尝试为奇数个空格创建一个令牌。这就是我目前的

TOKEN : {
< SPACE: " " > 
| < ODDSPACE: <SPACE> ((<SPACE>)(<SPACE>))* >
}

void Start() :
{}
{  
    <ODDSPACE>
}

这适用于3,5,7等空间,但是当我尝试仅使用一次空间时失败。任何想法为什么会这样?

1 个答案:

答案 0 :(得分:0)

参见JavaCC FAQ的问题3.3。 http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-moz.htm#tth_sEc3.3

  

挑选哪个正则表达式用于识别下一个标记有三个黄金规则:

     
      
  1. 正则表达式必须描述剩余输入流的前缀。
  2.   
  3. 如果多个正则表达式描述了前缀,则使用描述输入流的最长前缀的正则表达式。 (这称为&#34;最大咀嚼规则&#34;。)
  4.   
  5. 如果多个正则表达式描述了最长的前缀,则使用.jj文件中首先出现的正则表达式。
  6.   

在您的情况下应用规则3。您可以将start重写为

void Start() :
{}
{  
    <ODDSPACE> | <SPACE> 
}