解决JavaCC令牌歧义

时间:2014-04-30 09:07:24

标签: java regex parsing token javacc

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您正在尝试在扫描程序中执行某些应该在语法中执行的操作。扫描仪应将数字作为数字返回,并且在语法中允许数字和字符的位置,允许数字出现在制作中。