Ниже приведен фрагмент кода файла JLex, example.lex, который используется для распознавания комментариев формы (*...*):
<YYINITIAL> \(\*(([^\(*]|\(($|[^*])|\*($|[^\)]))*)\*\) {System.out.println("A comment.") ;}
Это строка 81 файла .lex. Ошибка, которую выдает 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.
Но регулярное выражение, похоже, имеет правильный синтаксис в соответствии с это. Итак, проблема, похоже, специфична для JLex.
Любые подсказки по решению этой проблемы приветствуются!
Обновлено: Ну, похоже, у JLex проблема с $. Например:
<YYINITIAL> 5($|5) {System.out.println("A dollar.") ;}
Выдает ту же ошибку. Тогда как,
<YYINITIAL> 5$ {System.out.println("A dollar.") ;}
ошибок не выдает. Это ошибка или какое-то хорошо аргументированное поведение?




Во многих библиотеках регулярных выражений $ - это утверждение нулевой длины, указывающее, что следующий символ является символом новой строки (или, в некоторых случаях, концом ввода, если ввод не заканчивается новой строкой). Поскольку он не соответствует следующему символу, если он используется в середине шаблона, за ним должно следовать что-то, что действительно соответствует новой строке (например, \n), и это сделает $ избыточным.
В JLex, как и в оригинальном Lex, $ можно использовать только в конец шаблона, что на самом деле является единственным местом, где это имеет смысл. В вашем случае я почти уверен, что вы могли бы просто написать [^*] вместо ($|[^*]) (например), поскольку «что угодно, кроме *» включает символы новой строки.
Спасибо за ответ!