我试图了解一些关于 LEXERS 的知识,我想知道如何才能优先考虑一个 token 而不是另一个 token 。 我将使用我遇到的实际问题作为引用。
我制作了两个标记,一个代表 TEXT,另一个代表列表。 它们都有一个共同的字符,这意味着列表也可以作为文本来阅读。
有没有办法对我想要的 token 给予某种优先级?
我查了很多,但没有找到任何关于这个主题的内容。 我尝试将列表的定义放在文本上方,但似乎没有改变任何内容。
TOKEN: {
<#DIGIT: ["0"-"9"]>
<#LETTER: ["a"-"z", "A"-"Z"]>
<#SYMBOLS: ["@" , "."]>
<#WORD: (<LETTER>|<DIGIT>|<SYMBOLS>)+>
}
TOKEN: {
...
<LI: ((<DIGIT>)+)(".")>
<TEXT: <WORD>+ >
...
}
如果我使用输入此内容作为词法分析器的输入,
1.this is a list
我希望能回来,
LI as 1.
TEXT as this is a list
但我得到的实际输出是
TEXT is 1.this is a list
谢谢
最佳答案
实际上Javacc使用两个规则来决定优先级,
RULE 1: priority by the order it occurs while declaring tokens.
RULE 2: priority based longest match possible.
RULE 2 始终优先于 RULE 1。也就是说,JavaCC 始终匹配输入的最长可匹配前缀;然后,如果有多个 token 与最长匹配匹配,则使用规则 1 来确定生成哪个 token 。
在您的情况下,您期望应用规则 1,但 JavaCC 使用规则 2,即最长的匹配;这就是结果。
此外,TEXT
无法匹配 this is a list
,因为它之间包含空格字符,这是 TEXT
的定义所不允许的>.
标记部分仅用于进行词法分析。因此使用产生式规则来进行语法分析。
关于java - 使一个 token 优先于另一个 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55872228/