2014-01-31 1 views
0

У меня возникла проблема с комментариями при создании пользовательского файла в NetBeans. Я получил два типа многострочных типов комментариев:Многострочный комментарий JavaCC в пользовательском плагине NetBeans

  1. начиная с /* и заканчивая */
  2. начиная с <!-- и заканчивая -->

MORE : { "/*": XSCRIPT_COMMENT | "<!--": XML_COMMENT }

<XSCRIPT_COMMENT> TOKEN : { <X_SCRIPT_COMMENT_END: "*/" > : DEFAULT }

<XML_COMMENT> TOKEN : { <XML_COMMENT_END: "-->" > : DEFAULT }

<XSCRIPT_COMMENT,XML_COMMENT> MORE : { < ~[] > }

проблема в том, что оба многострочные комментарии бросает TokenMgrError, когда я пишу начальную часть комментария (/* или <!--). Ошибка возникает только тогда, когда конечная часть отсутствует, а лексер достигает конца файла.

Моя цель - создать многострочные комментарии, которые похожи на другие типы комментариев (когда записана только начальная часть, остальная часть документа представляет собой текст типа комментария).

Извините, мой английский, а не мой родной язык.

+0

Обычно люди имеют противоположную проблему. Они используют одно регулярное выражение для соответствия комментариям, а затем задаются вопросом, почему они получают странные результаты, когда многострочный комментарий не закрывается до конца файла. Исправить их проблему - сделать то, что вы сделали выше! –

ответ

0

Один из способов сделать это - использовать одно регулярное выражение для соответствия комментариям. Например,/* .. */ многострочный комментарий может соответствовать

"/*" (("*")* ~["*"])* ("*" ("*")* "/"?)? 

Здесь я сделал окончательный "* /" необязательно. (Лучший способ придумать такое регулярное выражение, по моему опыту, состоит в том, чтобы преобразовать NDFA в RE, если вы знаете, как это сделать.)

Другой способ сделать это - разрешить пустую строка для завершения комментария. Добавьте эти два правила.

<XML_COMMENT> TOKEN : { <XML_COMMENT_END: "" > : DEFAULT } 
<XSCRIPT_COMMENT> TOKEN : { <X_SCRIPT_COMMENT_END: "" > : DEFAULT } 
+0

Используя регулярное выражение вместо «MORE», будет создано еще два TOKENS. При использовании «БОЛЬШЕ» вместо двух TOKENS будут два новых состояния. Что лучше? – MartinZ

+0

Я думаю, что оба подхода создают одну и ту же последовательность токенов для каждой входной последовательности символов. Учитывая выбор, я предпочитаю, какой из подходов будет легче всего понять для следующего человека. Это может быть подход лексического состояния. Кроме того, поскольку я сам не пробовал, мне интересно узнать, сработает ли это! –

0

Решает различные регулярные выражения. Сначала я создал детерминированный автомат только с ручкой и бумагой, но графический вид всегда лучший.

<XSCRIPT_COMMENT: 
"/*" (~["*"])* 
| 
"/*" (~["*"])* "*" (~["/"])* 
| 
"/*" (~["*"])* "*" (~["/"])* "/" 
> 

<XML_COMMENT: 
"<!--" (~["-"])* 
| 
"<!--" (~["-"])* "-" (~["-"])* 
| 
"<!--" (~["-"])* "-" (~["-"])* "-" (~[">"])* 
| 
"<!--" (~["-"])* "-" (~["-"])* "-" (~[">"])* ">" 
> 

Я понимаю, что оба выражения не связаны с минимизированным DFA, но это легче понять.

+0

Разве это не признает '/ * a * b /'? И узнает ли он '/ * a * b * c'? Вы используете правильный подход, но я не уверен, что вы получаете правильный результат. Это иллюстрирует один пункт в пользу лексических состояний: когда вы знаете, что такое DFA, вы можете просто сказать JavaCC, что это такое, и не нужно вычислять некоторое сложное регулярное выражение. –

4

Для меня, MartinZ's aswer также разрешает лексическую проблему JavaCC.

{ <COMMENT: "/*" (~["*"])* | 
      "/*" (~["*"])* "*" (~["/"])* | 
      "/*" (~["*"])* "*" (~["/"])* "/" > } 

 Смежные вопросы

  • Нет связанных вопросов^_^