Грамматика antlr C для создания AST

Доступна ли какая-либо грамматика C, которая генерирует AST, который включает все правила синтаксического анализатора с использованием "^" и "!" обозначения?

Я просмотрел книгу, написанную Теренсом Парром, чтобы написать такую ​​грамматику, но кажется, что написание одной такой грамматики для C lang - это трудоемкий процесс, поэтому мне было интересно, доступна ли она уже, что может сэкономить много времени!

(Грамматика для меньшего подмножества языка C тоже подойдет ..)

Спасибо :)


person Hari Krishna    schedule 14.04.2011    source источник
comment
@bart, я думаю, ты ошибся, это не Винод, извини :)   -  person Hari Krishna    schedule 14.04.2011
comment
@bart, ха-ха, я не знаю, что у тебя есть это сомнение, в любом случае видел другой профиль, о котором ты упоминал, по крайней мере, я включил дополнительную информацию обо мне, что я не могу сделать, просто чтобы иметь различную идентичность на этом сайте :)   -  person Hari Krishna    schedule 14.04.2011
comment
Хорошо, в таком случае я удалю свои комментарии. Удачи.   -  person Bart Kiers    schedule 14.04.2011
comment
Вы проверяли сайт ANTLR.org? Клянусь, я видел грамматику C. Сомневаюсь, обрабатывает ли он директивы препроцессора. Я знаю, что видел грамматику C ++, но это было не совсем правильно.   -  person Ira Baxter    schedule 15.04.2011
comment
Интересно, что Терренс Парр написал грамматику Antrl C. Вы ищете antlr.org/grammar/1153358328744/C.g?   -  person Rafe Kettler    schedule 15.04.2011
comment
@Rafe Kettler, нет, эта грамматика не создает AST, она просто создает плоское дерево синтаксического анализа.   -  person Bart Kiers    schedule 16.04.2011
comment
@Rafe, снова Барт прав, :) Я ищу грамматику C, которая может создавать AST в правильном формате!   -  person Hari Krishna    schedule 16.04.2011


Ответы (2)


Нет ответов через две недели.

Вы правы, создавая полный анализатор, который строит полные AST и обрабатывает все детали C (включая препроцессор), охватывающие множество диалектов C (например, ANSI, GNU C 2/3/4 /, Miscrosoft Visual C, Green Hills В) ... на самом деле много работы. И если вы не инвестируете в эту работу, он не сможет обрабатывать настоящие программы C.

Я ожидал, что будет полная грамматика ANTLR для C, которая сделала бы это, учитывая, сколько лет ANTLR. Удивительно, что здесь никого не может идентифицировать; конечно, вы ожидаете найти его на сайте ANTLR.

Мы вложили энергию, необходимую для создания таких синтаксических анализаторов C (охватывающих все вышеперечисленные диалекты), и добавили вычисление таблиц символов, извлечение потоков управления и данных, построение графиков вызовов, включение анализаторов и преобразования дерева в DMS Software Reengineering Toolkit с его C-интерфейс. Этот интерфейс был применен к приложениям C, состоящим из 18 000 единиц компиляции, для создания пользовательских инструментов анализа.

person Ira Baxter    schedule 28.04.2011

См. это. Это прямо из репозитория исходного кода ANTLR 4: грамматика C11. Это выглядит довольно совместимым.

Конечно, в нем нет препроцессора, но передать файл сначала cpp или mcpp достаточно просто.

Он также не поставляется с правилами AST, но это не кажется слишком трудным в исполнении (хотя и требует много времени).

person kirbyfan64sos    schedule 27.01.2015
comment
Хм. Грамматика принимает X * Y и как выражение, и как объявление; нет ничего, что явно разделяло бы эти два случая. Я не думаю, что ANTLR4 обрабатывает (фиксирует) двусмысленность, так что это не может быть правдой. Это старая проблема с синтаксическим анализом C и C ++: см. stackoverflow.com/questions/243383/ Возможно, эту грамматику удастся исправить, добавив обычный прием, замеченный в синтаксических анализаторах LALR для C. - person Ira Baxter; 28.01.2015
comment
@IraBaxter, разве не предполагается, что ветка будет первой? - person vines; 22.11.2015
comment
@vines: Предполагая, что ANTLR берет первую ветвь, независимо от того, как написаны правила грамматики для X * Y, фактическая семантическая интерпретация может быть противоположной (внимательно прочитайте мой ответ, на который я ссылаюсь). Это означает, что он не может постоянно получать правильную интерпретацию ... поэтому иногда он будет неправильно анализировать программу. Единственный выход - принять оба синтаксического анализа как действительные или исключить неправильный синтаксический анализ в момент его предложения. Я не верю, что ANTLR может сделать первое или что второе можно сделать без реализации того же ужасного взлома старых синтаксических анализаторов C. - person Ira Baxter; 27.11.2015