Ищем образец Antlr 3/C main()

Я вижу несколько примеров main() для C, например. http://www.antlr.org/wiki/display/ANTLR3/Five+minute+introduction+to+ANTLR+3 и http://www.antlr.org/api/C/index.html

Разыменование похоже на AST. Я не знаю, что это такое, и - прошу меня извинить - не хочу знать, если смогу этого избежать.

Я хотел бы просто определить лексер и грамматику (для AT-команд модема) и автоматически сгенерировать main() или вырезать/вставить откуда-нибудь.

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

Может ли кто-нибудь указать мне простой main(), который я могу адаптировать (и, может быть, предложить, как его адаптировать?) Много вопросов, которые я знаю, извините.


person Mawg says reinstate Monica    schedule 02.12.2009    source источник


Ответы (1)


AST — это «Абстрактное синтаксическое дерево», и для AT-команд оно вам не нужно.

На самом деле, ANTLR является излишним для парсинга AT-команд. Почему бы просто не проверить наличие «AT», а затем разобрать команды вручную? Набор команд модема, вероятно, достаточно прост, поэтому сделать это будет проще, чем запустить ANTLR, если вы никогда раньше этого не делали.

Если вы реализуете полный набор AT-команд, включая escape-последовательность «+++», синхронизация также является фактором, который вы не сможете реализовать, используя только ANTLR.

Ответ на комментарии:

Разумно рассматривать ANTLR как инструмент для уменьшения количества ошибок. В ответ на ваши вопросы «Вы бы предпочли читать это или написанный код? И что бы вы предпочли поддерживать?», ответ будет «это зависит». Я использую как ANTLR, так и парсеры с ручным кодом в зависимости от контекста; это контекст, в котором я бы выбрал синтаксический анализатор с ручным кодом. Некоторые причины: вероятно, встроенное приложение, относительно простое (много команд не равно сложности), протокол связи. У вас другой контекст и у вас явно есть свои причины, в том числе «попробовать».

Итак, чтобы ответить на ваш другой вопрос о главном: да, вы можете использовать его на вики ANTLR. Для чтения из части памяти используйте antlr3NewAsciiStringInPlaceStream() или antlr3NewAsciiStringCopyStream() (соответственно) вместо antlr3AsciiFileStreamNew().

person janm    schedule 02.12.2009
comment
Спасибо за разъяснение AST ;-) Кстати, не могли бы вы указать мне пример main()? Могу ли я просто использовать это на antlr.org/ вики/дисплей/ANTLR3/ ? - person Mawg says reinstate Monica; 03.12.2009
comment
Я думаю, что вы недооцениваете сложность AT-команд. В общем, для любой нетривиальной грамматики я бы предпочёл парсер, чем самодельный. Во-первых, визуальное представление грамматики AntlrWorks уже помогло мне обнаружить несколько ошибок, чтение кода и модульное тестирование могут не выявить все ошибки из созданного вручную синтаксического анализатора, я рассматриваю Antlr как еще один инструмент, помогающий уменьшить количество ошибок. . Я занимаюсь этим в качестве хобби после того, как на предыдущей работе увидел катастрофический самодельный синтаксический анализатор. 27.007 и, кажется, 25.007 (SMS) имеют несколько сотен команд. - person Mawg says reinstate Monica; 03.12.2009
comment
Хитрость в том, что некоторые из них имеют необязательные части, и, о, я просто думаю, что легче читать и поддерживать лексер/парсер, чем написанный от руки код. Я опубликую детали команды Dial, которая является одной из самых сложных, в нескольких комментариях (из-за ограничения по размеру), чтобы показать, что я имею в виду... - person Mawg says reinstate Monica; 03.12.2009
comment
Цифры набора V.250 1 2 3 4 5 6 7 8 9 0 * # + ABC (исполнение этих символов является обязательным для GSM/UMTS) D (исполнение этого символа является необязательным для GSM/UMTS и игнорируется) V .250 символы-модификаторы , (внедрение этого символа обязательно для GSM/UMTS, но может быть проигнорировано) TP (внедрение этих символов обязательно для GSM/UMTS, но они игнорируются) ! W @ (реализация этих символов не обязательна для GSM/UMTS, и они игнорируются) - person Mawg says reinstate Monica; 03.12.2009
comment
Символы-модификаторы GSM/UMTS › (см. подраздел «Прямой набор номера из телефонных книг») I или i (отменяет значение по умолчанию подписки на дополнительную услугу CLIR для этого вызова; I = вызов (ограничить представление CLI) и i = подавление (разрешить представление CLI); см. подпункт Ограничение идентификации вызывающей линии +CLIR) G или g (управление дополнительной служебной информацией ЗГП для этого вызова; используются значения индекса и информации, установленные с помощью команды +CCUG; см. подпункт Закрытая группа пользователей +CCUG) - person Mawg says reinstate Monica; 03.12.2009
comment
Прямой набор из телефонной книги 1. D›‹str›[I][G][;] инициировать вызов на телефонный номер, которому соответствует буквенно-цифровое поле ‹str› (если возможно, нужно найти правильную запись во всех доступных памяти). 2. D›mem‹n›[I][G][;] инициировать вызов на телефонный номер в ячейке памяти памяти ‹n› (доступные ячейки памяти можно запросить с помощью тестовой команды Select Phonebook Storage +CPBS=?; память может быть например Я). - person Mawg says reinstate Monica; 03.12.2009
comment
3. D›‹n›[I][G][;] инициировать вызов на телефонный номер в ячейке входа ‹n› (зависит от производителя, какая память MT, SIM/UICC и TA используется; команда Select Phonebook Memory Рекомендуется использовать настройку Storage +CPBS) - person Mawg says reinstate Monica; 03.12.2009
comment
Извините, что публикую так много текста, но я хочу подчеркнуть, что кодирование на C или C++ было бы кошмаром, но я сократил синтаксический анализатор (не буду утомлять вас токенами) до - person Mawg says reinstate Monica; 03.12.2009
comment
ATD_dial : AT_cmd_dial CLIR_override? V250_dialing_digits END_OF_DIAL? ; ATD_dial_from_phone_book : AT_cmd_dial_from_phone_book Decimal_number CLIR_override? GUG_токен? END_OF_DIAL?| AT_cmd_dial_from_phone_book PB_mem_type Десятичный_номер CLIR_override? GUG_токен? END_OF_DIAL?| AT_cmd_dial_from_phone_book Alpha_numeric_string CLIR_override? GUG_токен? END_OF_DIAL?; Вы бы предпочли прочитать это или специально созданный код? И что бы вы предпочли сохранить? - person Mawg says reinstate Monica; 03.12.2009
comment
Я не пытаюсь начинать здесь спор и очень благодарен за вашу помощь, но после того, как я увидел неудачную попытку создания кода, я много предпочел бы использовать лексер и синтаксический анализатор. Еще раз спасибо. - person Mawg says reinstate Monica; 03.12.2009