以下是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.") ;}
不会出现任何错误。这是一个错误还是一些合理的行为?
答案 0 :(得分:1)
在许多正则表达式库中,$
是一个零长度断言,表示下一个字符是换行符(或者,在某些情况下,如果输入未以换行符终止,则输入结束) 。由于它与下一个字符不匹配,如果它在模式的中间使用,则必须跟随一个与换行符匹配的东西(例如\n
)并且这样做会使{{{ 1}}冗余。
在JLex中,与原始Lex一样,$
只能在模式的 end 中使用,这是唯一有意义的地方。在您的情况下,我很确定您可以只编写$
而不是[^*]
(例如),因为“除了($|[^*])
之外的任何内容”都包含换行符。