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

时间:2018-03-11 16:42:46

标签: java lexical-analysis

以下是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.") ;}

不会出现任何错误。这是一个错误还是一些合理的行为?

1 个答案:

答案 0 :(得分:1)

在许多正则表达式库中,$是一个零长度断言,表示下一个字符是换行符(或者,在某些情况下,如果输入未以换行符终止,则输入结束) 。由于它与下一个字符不匹配,如果它在模式的中间使用,则必须跟随一个与换行符匹配的东西(例如\n)并且这样做会使{{{ 1}}冗余。

在JLex中,与原始Lex一样,$只能在模式的 end 中使用,这是唯一有意义的地方。在您的情况下,我很确定您可以只编写$而不是[^*](例如),因为“除了($|[^*])之外的任何内容”都包含换行符。