как вернуть что-то, когда в flex нет совпадения (lexer) - PullRequest
0 голосов
/ 06 марта 2012

Я использую flex (лексер) для лексического анализа.

Что мне нужно, это:

Если ни одно из правил не соответствует, то возвращается значение, указывающее, что такое произошло.

Это похоже на синтаксис default в структуре потока управления switch во многих языках программирования.

Есть ли способ делать такие вещи?

РЕДАКТ. 1: Справка от официальный документ

If no match is found, then the default rule is executed: 
the next character in the input is considered matched and copied to the standard output. 

Но как я могу изменить правило по умолчанию?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2017

Правило по умолчанию применяется только в том случае, если не найдено других правил.Таким образом, вы можете просто вставить свое собственное правило, которое соответствует любому отдельному символу, как последнее правило:

.|\n  {  /* Your default action. */ }

Оно должно идти в конце, потому что (F) lex будет отдавать приоритет более ранним правилам в файле, которые имеюттот же матчВам нужно явно упомянуть \n (если вы не уверены, что какое-то другое правило будет ему соответствовать), поскольку в (F) lex, . соответствует любому символу , за исключением новой строки.

Если вы используете Flex и не хотите, чтобы правило по умолчанию использовалось, рекомендуется ввести

%option nodefault

в ваш пролог.Это подавит правило по умолчанию и выдаст предупреждение, если есть входные данные, которые могут не соответствовать ни одному правилу.(Если вы проигнорируете предупреждение, для такого ввода будет выдана ошибка времени выполнения.)

0 голосов
/ 12 ноября 2012

В acacia-lex это делается следующим образом: У Лексера есть метод запуска:

@ Override

public void run () {

Token token;
while ((token = this.findNext()).isFound()) {
    System.out.println("LEXER RES = " + token.toString());

}

}

Когда ничего не найдено, правило по умолчанию отсутствует. Метод Lexer run только что завершил свою работу. Чтобы продолжить лексинг, в конце спецификации токенов необходим токен "DOT" -> ".". Поэтому, если никакие другие токены не совпадают, DOT будет совпадать, и запуск Lexer продолжит свою работу.

...