【问题标题】:Token for odd number of spaces奇数个空格的令牌
【发布时间】:2014-03-21 17:18:37
【问题描述】:

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

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

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

这适用于 3、5、7...等空间,但当我尝试仅使用一次空间时会失败。任何想法为什么会发生这种情况?

【问题讨论】:

    标签: token lexer javacc


    【解决方案1】:

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

    选择使用哪个正则表达式来识别下一个标记有三个黄金法则:

    1. 正则表达式必须描述剩余输入流的前缀。
    2. 如果多个正则表达式描述一个前缀,则使用描述输入流最长前缀的正则表达式。 (这称为“最大咀嚼规则”。)
    3. 如果有多个正则表达式描述了可能的最长前缀,则使用 .jj 文件中第一个出现的正则表达式。

    在您的情况下,适用规则 3。你可以将start改写为

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多