【问题标题】:Resolving JavaCC token ambiguity解决 JavaCC 令牌歧义
【发布时间】:2014-04-30 09:07:23
【问题描述】:

我正在尝试使用 JavaCC 解析正则表达式,但遇到了整数问题。问题是,有时,在某些作品中,我想将一组数字解释为每个字符,但是,在 (ab){1,20} 之类的东西上,我想将大括号内的数字解释为整数。问题是 JavaCC 正在选择列表中匹配的第一个标记,而不管生产中是否预期该标记。

我有一个令牌 DIGIT 和一个定义为一个或多个 DIGIT 的令牌 INTEGER。如果我优先考虑 DIGIT,它永远不会选择 INTEGER,如果我优先考虑 INTEGER,在我想逐个解释数字的产生式中,它会选择 INTEGER。

我还尝试在期望整数的生产中定义类似 ()+ 的东西,但是我不知道如何将其分配给令牌。有没有办法将整个序列分配给单个标记,或者至少将每个数字附加到一个标记的图像或存储一组标记?

【问题讨论】:

    标签: java regex parsing token javacc


    【解决方案1】:

    如果您希望数字有时被解释为单个标记,而在其他时候被解释为整数,您需要使用词法状态。请参阅文档和常见问题解答。您可能可以在{ 上切换状态,然后再在} 上切换状态。像这样的

    <DEFAULT> TOKEN : {
        <DIGIT : ["0"-"9"]>
    }
    <INBRACES> TOKEN : {
        <NUMBER : (["0"-"9"])+ >
    }
    <*> TOKEN {
        <LBRACE : "{" > : INBRACES 
    |
        <RBRACE : "}" > : DEFAULT
    |
        ...other rules apply in all states...
    }
    

    【讨论】:

      【解决方案2】:

      您正在尝试在扫描仪中做一些应该在语法中完成的事情。扫描仪应将数字作为数字返回,并且在语法中您希望允许数字和字符的地方,允许数字出现在产生式中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-05
        相关资源
        最近更新 更多