Получить парсер clang / llvm от парсера yacc

Пытаюсь построить парсер для Промелы в llvm. У меня есть парсер, который использует SPIN, который построен с использованием yacc, включая входные данные, которые поступают в yacc. Есть ли способ использовать парсер yacc для быстрого и безболезненного создания парсера clang / llvm? Я буду использовать его для создания графиков вызовов и выполнения статического анализа.


person Brishna Batool    schedule 05.07.2019    source источник
comment
Что вы имеете в виду под парсером clang / llvm? Парсер, который создает на выходе битовый код LLVM? Тот, который генерирует AST, который затем транслируется в битовый код LLVM? Конечно, вы можете это сделать, это не редкость. Но Кланг не имел к этому никакого отношения. Если вы хотите сгенерировать Clang AST, ответ вроде бы, но это было бы плохой идеей. Clang AST специально разработан для языков C-семейства, и вы не можете легко представить в нем другие языки. Таким образом, создание Clang AST для языка, отличного от C, означало бы перевод его на C. Также вам не нужен clang для графа вызовов - просто LLVM.   -  person sepp2k    schedule 05.07.2019
comment
Я надеялся найти способ использовать существующий парсер yacc для создания парсера clang (и, следовательно, AST) с минимальными усилиями.   -  person Brishna Batool    schedule 08.07.2019
comment
Термин clang parser меня до сих пор смущает. Вы можете пояснить, что вы имеете в виду? В моем мире есть the синтаксический анализатор clang, который анализирует C, C ++ и Objective C в AST, специфичный для семейства C, который позже транслируется в битовый код LLVM. Итак, когда вы говорите, что хотите создать синтаксический анализатор clang, вы имеете в виду, что хотите, чтобы ваш синтаксический анализатор генерировал тот же AST, что и синтаксический анализатор clang (что я считаю плохой идеей, как объяснялось в моем предыдущем комментарии) или что-то еще?   -  person sepp2k    schedule 08.07.2019
comment
Я думал о clang + llvm как о законченной структуре и не знал должным образом об их различиях / границах, поэтому спасибо за указание на это. Моя цель - выполнить статический анализ Promela, начиная с создания AST. Я хотел сделать это на LLVM из-за множества доступных инструментов анализа. Как вы объяснили, кажется, что лязг не имеет места в этом процессе. Теперь мне нужно знать, могу ли я использовать существующий компилятор Promela, который был построен с помощью yacc, для быстрого создания синтаксического анализатора (а позже и генератора IR) с использованием инфраструктуры llvm.   -  person Brishna Batool    schedule 12.07.2019


Ответы (1)


Теперь мне нужно знать, могу ли я использовать существующий компилятор Promela, который был построен с помощью yacc, для быстрого создания синтаксического анализатора (а позже и генератора IR) с использованием инфраструктуры llvm.

Да, вы можете повторно использовать существующую грамматику YACC (и, если хотите, даже существующий AST) для своего проекта. «Создание синтаксического анализатора с использованием среды llvm» немного вводит в заблуждение, потому что LLVM не имеет ничего общего с синтаксическим анализом и AST. LLVM не войдет в него, пока вы не сгенерируете LLVM IR и не начнете с ним работать.

Таким образом, вы либо берете существующую грамматику YACC и существующий AST, либо вы берете только грамматику и заменяете действия теми, которые создают ваш собственный AST, который вы определили сами. В любом случае эта часть не будет включать LLVM.

Затем вы должны написать отдельную фазу, которая обходит AST и генерирует LLVM IR с помощью LLVM API, на котором вы затем можете запускать все преобразования и анализы, поддерживаемые LLVM.

person sepp2k    schedule 14.07.2019
comment
В качестве альтернативы вы можете воспользоваться грамматикой YACC и написать действия, которые генерируют LLVM IR, используя LLVM API напрямую, минуя AST. - person Chris Dodd; 14.07.2019