2010-01-05 2 views
5

Я хочу сгенерировать код C. Я не буду читать из входного файла, по одной строке за раз (как, например, компилятор). Скорее, я буду разбирать пользовательский ввод по мере его поступления, по одной строке за раз.Ищет очень простой пример обработки ошибок ANTLR при генерации кода C

Я бы предпочел, чтобы обнаруживать и обрабатывать плохой вход в лексером/парсер, например

/* lexer tokens */ 
foo : "FOO"; 
bar : "BAR"; 
baz : "BAZ"; 
/* grammar*/ 
grammar : foo "=" BAZ 
     | foo "=" BAR 
     | <some non-existent Antrl-else> : {printf(stderr, "bad input\n");} 
     ; 

ОК, если я не могу поймать его в лексером/парсер, похоже, мне нужно использовать displayRecognitionError() но как??

Может ли кто-нибудь указать мне на очень простой пример, который генерирует код C и показывает некорректную обработку недопустимого ввода?

Спасибо!


Хорошо, щедрость, юпитер!

Но только для реального рабочего ответа с реальным рабочим кодом. Нет «использовать метод X()» без wxample.

+1

FYI: эта награда будет отправляться на ответ с наибольшим количеством голосов после истечения срока, независимо от того, принимаете вы ответ или нет. –

+1

Возможно, эта тема поможет: http://markmail.org/message/pumvrybnhvfme5h6#query:rulecatch%20antlr%20c+page:1+mid:3jjjdzbecknrq644+state:results (обратите внимание на различные ответы, отправленные на этот вопрос!) –

+1

Я вижу, что вы используете printf в своем примере. Является ли язык, на котором вы используете C или C++? – chollida

ответ

5

Обработка исключения распознавания в Java будет идти, как это:

grammar X; 

// ... 

@rulecatch{ 
    catch(RecognitionException rex) { 
    // do something 
    } 
} 

// parser rules 

// lexer rules 

Другими словами, просто добавить пользовательский код C внутри @rulecatch{ ... } блока.

+0

Барт, я подозреваю, что это лучший ответ, который я получу. Я оставлю его открытым на несколько дней, juts на случай, если кто-то даст какой-нибудь блестящий демо-код C, а затем присудите вам ответ, если нет. благодарит за помощь – Mawg

+1

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

+1

Я быстро посмотрел на время выполнения C: 'configure'-ing и' make'-во время выполнения для C и генерация lexer & parser прошла нормально, но написание небольшого приложения с основным методом, который использует эти lexer & parser файлов не было, и мне не хотелось больше тратить на это время, извините. Я надеюсь, что кто-то другой сможет вам помочь. Но вы пробовали то, что я рекомендовал? Если вы попытались, но не смогли, это может помочь указать, что именно пошло не так. Удачи. –

7

Что вы, скорее всего, ищете, является функция displayRecognitionError(). Эта функция вызывается в тех случаях, когда вас интересует, и является частью среды выполнения C.

Если вы хотите увидеть пример использования этой функции, посмотрите на this mailing list post. Хотя этот код смешивает C и C++, вы должны уметь выработать то, что вам нужно.

+0

Большое спасибо, я проверю это. Извините, что я уже принял ответ; Я не ожидал другого. – Mawg

+1

Не беспокойтесь - надеюсь, что это поможет вам –