Войти
ПрограммированиеФорумОбщее

AST c++ парсер

Страницы: 1 2 Следующая »
#0
17:32, 15 ноя. 2016

Какие есть вменяемые парсеры-построители AST для крестов? libclang смотрел - всё хорошо но есть косяк, что она не умеет игнорировать ошибки... вернее не так - все неизвестные типы она представляет как int - и получить оригинальное название не представляется возможным - по крайней мере я не нашел как это сделать


#1
19:34, 15 ноя. 2016

Сомневаюсь, что найдешь что-то лучше чем clang.

#2
9:26, 16 ноя. 2016

К сожалению, просто так парсить С++ нельзя, нужно компилировать.
Вот пример: https://godbolt.org/g/EoHKbJ
В зависимости от sizeof(long) (т.е., скажем, линукс 32- или 64-битный), часть выражения

 Bar< 3 > :: foo() 
распарсится так, что вызовется либо статический метод foo() из Foo::Bar, либо как глобальная функция ::foo(), и в этом случае '<' и '>' - это не скобки, а операторы сравнения.

Т.е. совершенно разные деревья будут в зависимости от размера long.

Такие дела.

#3
10:44, 16 ноя. 2016

Wraith
> Т.е. совершенно разные деревья будут в зависимости от размера long.
разрядность известна - это не проблема

PaulSh
> Допилить исходники?
ога и допиливать их каждый раз как они что-то обновят

На самом деле задача немного проще - нужно не полное ast, а лишь для реализации подсказок аля isense или ассист в студии - ну конечно не такие крутые... короче нужно фактически обрабатывать препросессор, делать лексинг, а из парсинга нужно лишь набор скопов, названий типов, переменных, членов и функций. Всякая математика не нужна, хотя наверное всё равно это будет львиная доля из полного аст

#4
11:14, 16 ноя. 2016

fsmoke
> набор скопов, названий типов, переменных, членов и функций
Для аналогичной задачи писал свой парсер. Средних размеров проект парсит пару-тройку секунд, а с кешированием 0.2-0.3 секунды, чего имхо сложно будет добиться с честным clang

#5
11:53, 16 ноя. 2016

fsmoke
> разрядность известна - это не проблема
Прочитай внимательно пример - дело не в разрядности, а в том, что в зависимости от аргумента шаблона для Foo<> у тебя подвыражение Bar< 3 > :: foo() вообще парсится по-разному.

>На самом деле задача немного проще - нужно не полное ast, а лишь для реализации подсказок аля isense или ассист в студии - ну конечно не такие крутые... короче нужно фактически обрабатывать препросессор, делать лексинг, а из парсинга нужно лишь набор скопов, названий типов, переменных, членов и функций. Всякая математика не нужна, хотя наверное всё равно это будет львиная доля из полного аст
Visual Assist компилирует на лету только чтобы показывать подсказки, да.

#6
13:22, 16 ноя. 2016

Wraith
> Прочитай внимательно пример - дело не в разрядности

я внимательно прочитал - и ещё раз говорю, что разрядность известна, известна на столько, чтобы сказать про нее парсеру - чтобы он в свою очередь построил аст так как надо.

Добавил:
К тому же разворачивание темплейтов особенно рекурсивных - это уже даже не парсинг синтаксиса - это семантика, а семантика "это уже совсем другая история" (с)

#7
13:25, 16 ноя. 2016

Wraith
> Visual Assist компилирует на лету только чтобы показывать подсказки, да.
не совсем понял фразу - это утверждение или что? К слову я не знаю точно что там делает ассист, но сомневаюсь что он именно "компилирует" в полном смысле этого слова, на сколько я понимаю ассист построен на scintillовском лексере, так что сомневаюсь что здесь идет речь о компиляции как таковой

#8
13:31, 16 ноя. 2016

anz
> Для аналогичной задачи писал свой парсер.

Вот и я о том же - задача избита со всех сторон, но всё равно каждый раз приходится писать велосипеды т.к. оказывается ничего и нет - ужс, 21 век, кажется уже всё написано до нас, но всё равно встречается какая нибудь ж...а

#9
14:16, 16 ноя. 2016

fsmoke
> Вот и я о том же - задача избита со всех сторон, но всё равно каждый раз
> приходится писать велосипеды т.к. оказывается ничего и нет - ужс, 21 век,
> кажется уже всё написано до нас, но всё равно встречается какая нибудь ж...а
как вариант, взять qtcreator и выдрать оттуда то, что нужно, он опенсорсный, и необходимый тебе функционал там уже реализован. но да придется разбираться.

#10
14:22, 16 ноя. 2016

fsmoke
> К тому же разворачивание темплейтов особенно рекурсивных - это уже даже не
> парсинг синтаксиса - это семантика, а семантика "это уже совсем другая история"
> (с)
Но без разворачивания шаблонов ты не сможешь сказать - a< b > c - это шаблон или два оператора сравнения.

#11
20:59, 16 ноя. 2016

kipar
> Но без разворачивания шаблонов ты не сможешь сказать
смогу, по крайней мере в конкрентом этом случае - т.к. локальные переменные a b c - будут иметь бОльший приоритет, чем классы с такими же именами в этом скопе

template <class T>
struct a{};

struct b{};

int main() {
    //comment to got declaration insteed of comparision
    int a,b,c
        
    a < b > c;
    return 0;
}
#12
22:16, 16 ноя. 2016

Писал парсер с++ (стандарт 03 года). Самый простой способ разбирать полноценный язык это по ходу балета всегда иметь полное знание об уже разобранных типах, что требует и разворачивания шаблонов. Это не компиляция на самом деле, как пишут выше, но тоже нетривиально. В противном случае ветвления дерева неизбежны.

Не забываем так же про препроцессор. Там тоже работы хватает. Всё это не касается компилирования, но труда уже на один-два человека-год. Опять же это в случае полноценного решения. Нужно знать задачу, возможно что-то частное подойдёт. Готовое решения брать скорее всего (и допиливать если требуется) если речь не об убийце gcc/clang.

#13
13:11, 17 ноя. 2016

fsmoke
ну ок, в этом сможешь. А в примере типа

confusing<sizeof(x)>::q < 3 > (2)
- нет.
http://yosefk.com/c++fqa/web-vs-c++.html#misfeature-3
#14
15:32, 17 ноя. 2016

kipar
> - нет.
да здесь явно нет :) ...я не спорю - разворачивания темплейтов придется делать рано или поздно, просто с начала надо хотя бы синтаксический анализ сделать, я кстати вообще изначально спрашивал про готовый инструмент, но как обычно всё скатилось к написанию велосипеда

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.