java - 使一个 token 优先于另一个 token

标签 java javac lexer javacc

我试图了解一些关于 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/

相关文章:

Java 8 编译器错误 - 如何获取更多信息?

lexer - 最简单的嵌套 block 解析器

java - SoapFaultClientException : outputting detail

图形元素上的 Java MouseListener

javac -sourcepath 选项不起作用

Javac 未被识别为内部或外部命令

parsing - OCaml + Menhir 编译/写作

java - EBNF 到 JavaCC 词法分析器

java - 如何使用 SentiWordNet

java - Java中打开带参数的exe,不懂参数