以下是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.") ;}
没有给出任何错误。这是错误还是某些合理的行为?
最佳答案
在许多正则表达式库中,$
是零长度的断言,指示下一个字符是换行符(或者在某些情况下,如果输入未以换行符终止,则输入的末尾)。由于它与下一个字符不匹配,因此如果在模式中间使用它,则必须后面跟一个与换行符匹配的内容(例如\n
),这样做会使$
成为多余。
与最初的Lex一样,在JLex中,$
只能在模式的末尾使用,这实际上是唯一有意义的地方。对于您的情况,我非常确定您可以只写[^*]
而不是($|[^*])
(因为),因为“除*
之外的任何内容”都包含换行符。