2009-12-10 2 views
0

Итак, я разбираю команды Hayes modem AT. Не читается из файла, но передается как char * (я использую C).Обработка недопустимого ввода в Lexer/Parser

1) что произойдет, если я получу то, что полностью не признаю? Как мне это обработать? 2), что если у меня есть что-то вроде

my_token: "cmd param=" ("value_1" | "value_2"); 

и получить недопустимое значение «PARAM»?

Я вижу несколько советов, позволяющих программе back-end (в C) обрабатывать ее, но это идет против зерна для меня. Поймай эту проблему как можно раньше, мой девиз.

Есть ли способ поймать «другие» условия в правилах lexer/parser?

Заранее спасибо ...

ответ

0

Я думаю, что вы ищете Custom Syntax Error Recovery, чтобы встроить в свою грамматику.

EDIT

У меня нет опыта работы с ANTLR и С (или только C по этому вопросу), поэтому следовать этому совету с осторожностью! :)

Глядя на страницу: http://www.antlr.org/api/C/using.html, возможно, часть внизу, Внедрение индивидуальных методов - это то, что вам нужно.

HTH

+0

Теперь это больше похоже на это. Кроме того, конечно, это для Java. Когда я смотрю в сгенерированном код C, я вижу

if (HASEXCEPTION())
Проблемы заключается в том, конечно, что я не хочу, чтобы редактировать сгенерированный код C в случае, если я нахожу ошибку в лексическом анализаторе или парсер правило, регенерировать код & потерять мои изменения. Вот почему я хотел бы что-то в файле Antlr как
My_rule:  { My_rule:  { 
Mawg

+0

пример говорит

 myRule: TOK TOK1 TOK2 subRule? ; catch [RecognitionException re] { // First, let's report the error as the user needs to know about it // reportError(re); myRecoverMethodForMyRule(); } 
Но как я могу это осуществить? есть одно правило для допустимого ввода, за которым следует одно, где я подстановил токены? Спасибо за ваш helkp до сих пор, вы приближаете меня к нему ... – Mawg

+0

Или мне нужно переопределить recoverFromMismatchedToken (()? – Mawg

1

Это вещь: весь смысл вашего синтаксического анализа и лексический, чтобы взорвать, если вы получаете плохой вход, то поймать удар и представить сообщение об ошибке симпатичного к пользователь.

+0

oops, это не так просто. Я забыл упомянуть то, что я сказал в другой теме. Вход не находится в файле, который разобран все сразу, как это может сделать компилятор. Это для встроенной системы. Всякий раз, когда пользователь отправляет AT-команду, эта команда анализируется и выполняется. Некоторое время спустя приходит другая команда ... В любом случае, я могу проверить ввод в сгенерированном C-коде, но я предпочитаю его как можно раньше обнаружить. Я хочу поймать его в лексере или синтаксическом анализаторе, а затем использовать быстрый код C для ответа «ОШИБКА». – Mawg

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