Автор Тема: Простая библиотека-парсер C/C++  (Прочитано 21041 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #30 : Май 15, 2013, 07:28:06 pm »
Чегой-то repl.it глючит (наверно на плюсах писан)
В общем вот:
local s = [[
typedef int (*cdCallback)(cdCanvas* canvas, ...);
int cdContextRegisterCallback (cdContext *context, int cb, cdCallback func);
unsigned long cdContextCaps   (cdContext *context);
int cdContextIsPlus           (cdContext *context);
int cdContextType             (cdContext *context);

int  cdCanvasClip         (cdCanvas* canvas, int mode);
void cdCanvasClipArea     (cdCanvas* canvas, int xmin, int xmax, int ymin, int ymax);
int  cdCanvasGetClipArea  (cdCanvas* canvas, int *xmin, int *xmax, int *ymin, int *ymax);
void cdfCanvasClipArea    (cdCanvas* canvas, double xmin, double xmax, double ymin, double ymax);
int  cdfCanvasGetClipArea (cdCanvas* canvas, double *xmin, double *xmax, double *ymin, double *ymax);
]]

print '------------------------------------------------------------------------'

types = {
    int = 'INTEGER',
    ['unsigned long'] = 'INTEGER',
    double = 'LONGREAL',
    void = ''
}

local function getpars(par)
    t = {}
    for p in par:gmatch '(%a+[%s%*]+%s-%a-)%s-[,%s)]' do
        local typ, nam = p:match '([%a%s]-)[%s%*]+(%a+)$'
        t[#t+1] = nam..': '..(types[typ] or typ)
    end
    return (table.concat(t, '; '))
end

for line in s:gmatch '[^\r\n]+' do
    t = {line:match '(%a+%s-%a-)%s+(%a+)%s+%(([^%(^%)]+%))%s-;'}
    local par, nam, typ = t[#t], t[#t-1], t[#t-2]
    if par then
        -- print(typ, '|', nam, '|', par)
        local def = 'PROCEDURE '..nam..' ('..getpars(par)..'): '..(types[typ] or typ)..';'
        print(def)
        getpars(par)
    end
end

результат:
PROCEDURE cdContextRegisterCallback (context: cdContext; cb: INTEGER; func: cdCallback): INTEGER;
PROCEDURE cdContextCaps (context: cdContext): INTEGER;
PROCEDURE cdContextIsPlus (context: cdContext): INTEGER;
PROCEDURE cdContextType (context: cdContext): INTEGER;
PROCEDURE cdCanvasClip (canvas: cdCanvas; mode: INTEGER): INTEGER;
PROCEDURE cdCanvasClipArea (canvas: cdCanvas; xmin: INTEGER; xmax: INTEGER; ymin: INTEGER; ymax: INTEGER): ;
PROCEDURE cdCanvasGetClipArea (canvas: cdCanvas; xmin: INTEGER; xmax: INTEGER; ymin: INTEGER; ymax: INTEGER): INTEGER;
PROCEDURE cdfCanvasClipArea (canvas: cdCanvas; xmin: LONGREAL; xmax: LONGREAL; ymin: LONGREAL; ymax: LONGREAL): ;
PROCEDURE cdfCanvasGetClipArea (canvas: cdCanvas; xmin: LONGREAL; xmax: LONGREAL; ymin: LONGREAL; ymax: LONGREAL): INTEGER;
« Последнее редактирование: Май 15, 2013, 07:29:38 pm от ilovb »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #31 : Май 16, 2013, 05:49:05 am »
http://repl.it/IyZ

Another one bites the dust!

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #32 : Май 22, 2013, 08:34:04 pm »
Последняя версия скрипта: http://repl.it/JDv

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простая библиотека-парсер C/C++
« Ответ #33 : Май 08, 2014, 12:51:29 pm »
Вот она рыба моей мечты: https://github.com/eliben/pycparser