JavaCC регулярное выражение для однострочного комментария - PullRequest
1 голос
/ 10 января 2020

Я пишу лексер для пользовательского языка и хочу сопоставить одну строку комментария, начинающуюся с #, как в python, но здесь комментарий всегда начинается с начала строки. Пример:

#this is a comment and #this is not a comment

Я пробовал это: "^ #" (~ ["\ n"]) * ("\ n")? но не работает. Как мне этого добиться?

1 Ответ

0 голосов
/ 12 января 2020

К сожалению JavaCC не поддерживает ^ для начала строки и $ для конца строки.

Вы можете использовать лексические состояния. Используйте состояние по умолчанию * для начала строки. Например:

// If at the start of a line, skip a # and all other charaters on the line.
// Stay in the same state.
<*>          SKIP : { <COMMENT : "#" (~["\n"])* ("\n") > : * }

// Skip any newlines and return to (or stay in) the start of line state.
<*, MIDLINE> SKIP : { <NEWLINE : "\n" >                  : * }

// Skip any other white space.
<*, MIDLINE> SKIP : { <WHITESPACE : " " | "\t"  >        : MIDLINE }

// If not at the start of line, a # is a token.
<MIDLINE>    TOKEN : { <HASH    : "#" >                   : MIDLINE }

// Numbers can be at the start of a line or the middle of a line.
// After a number, we are no longer at the start of line.
<*, MIDLINE> TOKEN : { <NUMBER : ["0"-"9"]+ >            : MIDLINE }

и т. Д.

...