Синтаксическая ошибка JLex при распознавании комментариев

Ниже приведен фрагмент кода файла 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.") ;}

ошибок не выдает. Это ошибка или какое-то хорошо аргументированное поведение?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
187
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во многих библиотеках регулярных выражений $ - это утверждение нулевой длины, указывающее, что следующий символ является символом новой строки (или, в некоторых случаях, концом ввода, если ввод не заканчивается новой строкой). Поскольку он не соответствует следующему символу, если он используется в середине шаблона, за ним должно следовать что-то, что действительно соответствует новой строке (например, \n), и это сделает $ избыточным.

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

Спасибо за ответ!

Mooncrater 12.03.2018 17:27

Другие вопросы по теме