识别注释时出现 JLex 语法错误

JLex syntax error while recognizing comments

以下是 JLex 文件 example.lex 的代码片段,用于识别 (*...*) 形式的评论:

<YYINITIAL>  \(\*(([^\(*]|\(($|[^*])|\*($|[^\)]))*)\*\) {System.out.println("A comment.") ;}

.lex文件的第81行。 JLex 给出的错误是:

C:\JAVA>java JLex.Main example.lex
Processing first section -- user code.
Processing second section -- JLex declarations.
Processing third section -- lexical rules.
Creating NFA machine representation.
Error: Parse error at line 81.
Description: Syntax error.
Parse error.

但是,根据 this,正则表达式似乎具有正确的语法。所以,这个问题似乎是 JLex 特有的。

欢迎提供解决此问题的任何提示!

编辑: 好吧,JLex 似乎对 $ 有问题。例如:

<YYINITIAL> 5($|5) {System.out.println("A dollar.") ;}

给出同样的错误。
然而,

<YYINITIAL> 5$ {System.out.println("A dollar.") ;}

没有给出任何错误。这是一个错误还是一些合理的行为?

在许多正则表达式库中,$ 是一个 zero-length 断言,表示下一个字符是换行符(或者,在某些情况下,如果输入未终止,则表示输入结束换行)。因为它不匹配下一个字符,如果它用在模式的中间,它后面必须跟一些匹配换行符的东西(比如 \n),这样做会使 $ 多余。

在 JLex 中,与在原始 Lex 中一样,$ 只能用在模式的 末尾 ,这确实是唯一有意义的地方.在你的情况下,我很确定你可以只写 [^*] 而不是 ($|[^*]) (例如),因为 "anything but a *" 包含换行符。