Как вы объявляете этот макрос в lex?

Я новичок в Лекс, и я запутался в том, как объявить следующий макрос, ключевое слово. Я хочу, чтобы ключевое слово состояло из "если", "тогда", "еще" или "пока".

Я набрал это в лекс:

keyword                   "if" | "then" | "else" | "while"

но компилятор выдает мне "нераспознанную ошибку правила". Когда я вместо этого

keyword                   "if"

Компилируется нормально.

Это просто ограничение Лекса? Я знаю, что в jflex вы можете делать то, что я делал выше, и это будет работать нормально. Или я делаю это неправильно?

Спасибо

1 ответ

Я не могу проверить это прямо сейчас, но с головы до головы:

Попробуйте поставить значения в скобках (перед первым %%)

keyword                   ("if"|"then"|"else"|"while")

А затем используйте его в правилах, подобных этому (между %% и %%):

{keyword}   {//action}

Вот как вы делаете класс в lex, поэтому в остальной части кода вы можете использовать {keyword} и он будет распознан как регулярное выражение, назначенное вами в разделе определения (перед первым %%). Кроме того, вы можете использовать класс как часть других регулярных выражений:

{keyword}\{[^\}]\}   {//action}

Это распознает целый блок кода. (но он не проверяет синтаксис внутри блока, я оставляю это вам:))

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