vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-05-08 05:54 pm

Как распарсить Си-шный код

Оказывается, кланг умеет выгружать синтаксическое дерево в формате JSON. Так что на парсере на первых порах можно сэкономить. Например, возьмём один из файлов ядра Unix v7.
$ git clone https://github.com/besm6/v7besm
$ cd v7besm/kernel
$ clang -target i486-unknown-linux-gnu -ffreestanding -Xclang -ast-dump=json -fsyntax-only -I../include -DKERNEL utab.c > utab.ast
Вот такой файл utab.ast получается: gist.github.com/sergev/a99a668b1419dc6dee584dea9c322fd5
spamsink: (Default)

[personal profile] spamsink 2025-05-09 01:05 am (UTC)(link)
Боюсь, парсить все теги JSON и собирать всё это в разнообразные структуры в зависимости от их сочетания дороже выйдет.
juan_gandhi: (Default)

[personal profile] juan_gandhi 2025-05-09 05:45 am (UTC)(link)
Очень хорошая идея. Мне вот это ещё понравилось:
      "loc": {
        "offset": 4699,
        "line": 130,
        "col": 14,
        "tokLen": 5,
        "includedFrom": {
          "file": "utab.c"
        }
      }


Я вечно размышлял, как позицию записывать, когда парсишь. А просто: и так, и так.
archaicos: Шарж (Default)

[personal profile] archaicos 2025-05-09 06:01 am (UTC)(link)
Там же вроде среди исходников УНИХ есть и K&R-Си компилятор об нескольких проходах. Он генерирует дерево в каком-то виде.
chaource: (Default)

[personal profile] chaource 2025-05-09 07:48 am (UTC)(link)
https://gist.github.com/sergev/a99a668b1419dc6dee584dea9c322fd5#file-v7-besm-utab-ast-L177

А вотъ это ой-ой-ой:

"qualType": "struct (unnamed struct at ../include/sys/param.h:121:9) *"


Какъ будемъ это чудо-юдо парсить? Потому что дальше тамъ будетъ еще и такое:

"qualType": "unsigned short"
"qualType": "int[6]"