Путаница в продолжении проекта, связанного с синтаксическим анализатором C - PullRequest
1 голос
/ 20 марта 2011

Моя цель - создать программу (использующую C ++), которая будет принимать исходный код на C и проверять "SYNTAX ERRORS ONLY".

Теперь для этого нужно знатьо регулярных выражениях, генерации грамматики и синтаксических анализаторах ??

Я хотел бы использовать такие инструменты, как Yacc / Flex / Bison - но проблемы, с которыми я сталкиваюсь, -

  1. Какиспользовать эти инструменты?Я имею в виду, что только царапаюсь на поверхности, когда читаю об этих инструментах - я чувствую себя невежественным.

  2. Как я могу использовать эти инструменты в тандеме с моим исходным кодом C ++?

  3. How "The Hell" do i Get Started with this?

Ответы [ 5 ]

2 голосов
/ 20 марта 2011

Использовать чей-то парсер Си. Например, парсер, используемый проектом clang. http://clang.llvm.org/

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

0 голосов
/ 31 марта 2011

Как вы определяете «ТОЛЬКО СИНТАКСИЧЕСКИЕ ОШИБКИ»? Если вы просто хотите узнать, что это за ошибки, почему бы вам не вызвать внешний gcc, чтобы выполнить компиляцию и сообщить об ошибках?

0 голосов
/ 20 марта 2011

Все зависит от того, какие ошибки вы хотите проверить.

В любом случае вам обязательно нужно больше узнать об архитектурах компилятора.Эта книга является справочником http://www.cs.princeton.edu/~appel/modern/c/

  • Если вы хотите работать на синтаксическом уровне, вы, безусловно, хотите работать с lex и Yacc.Эта ссылка может помочь вам начать работу с рабочей грамматикой (хотя и устаревшей): http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
    С помощью регулярных выражений можно выполнить менее мощную проверку синтаксиса.Вы можете сделать меньше с регулярным выражением, чем с реальным парсером (см. http://en.wikipedia.org/wiki/Chomsky_hierarchy). Но это, безусловно, гораздо более практично.

  • , если вы хотите выполнить проверку высокого уровня.«Эта группа функций всегда принимает константные параметры?» И т. Д. Вы, вероятно, можете использовать возможность GCC для вывода абстрактных синтаксических деревьев (см. http://digitocero.com/en/blog/exporting-and-visualizing-gccs-abstract-syntax-tree-ast). Проверяет также другие компиляторы или интерфейс. Абстрактное дерево содержит многоинформацию, которую вы можете «проверить».

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

см. также:
http://decomp.ulb.ac.be/roelwuyts/playground/canalysistools/
http://wiki.altium.com/display/ADOH/Static+Code+Analysis+-+CERT+C+Secure+Code+Checking

Некоторые люди в моих предыдущих лабораториях работали надАнализ и преобразование C и C ++ http://www.lrde.epita.fr/cgi-bin/twiki/view/Transformers/ Проект находится в режиме ожидания и оказался сложным предметом даже для людей, привыкших писать компилятор (особенно в случае преобразования C ++).

Наконец, ваши потребности могут быть намного проще, чем это.Вы думали о

FILE *output = popen("gcc -Wall my_c_file.c", "r");

(а затем просто проверяли вывод gcc)

0 голосов
/ 20 марта 2011

Я также предлагаю вам посмотреть, как другие проекты делают то же самое. Их часто называют lint в их имени, как http://www.splint.org/

0 голосов
/ 20 марта 2011

Чтобы начать работать с Yacc и Lex (или версиями Gnu, Bison и Flex), я могу порекомендовать Тома Ниманна Компактное руководство по Lex & Yacc .

...