parser generator
От: ival  
Дата: 03.05.12 11:49
Оценка:
Неподскажите ли LR (1) parser generator под linux в котором можно без гемороя назначать с++ классы к качестве semantic_type к символам грамматики. Провобвал bison, но в нем %union позволяет хранить только указатели, и поэтому получается много гемороя с memory management.

Есть ли что-нибудь по-проще?
Re: parser generator
От: ML380 Земля  
Дата: 03.05.12 11:55
Оценка:
ANTLR?
Re[2]: parser generator
От: ival  
Дата: 03.05.12 12:03
Оценка:
Здравствуйте, ML380, Вы писали:

ML>ANTLR?


Нужен именно LR(1), LALR (1) и т.п. В ANTLR вроде только LL(*)
Re: parser generator
От: sokel Россия  
Дата: 03.05.12 21:00
Оценка:
Здравствуйте, ival, Вы писали:

I>Провобвал bison, но в нем %union позволяет хранить только указатели, и поэтому получается много гемороя с memory management.


Можно в контексте иметь что то вроде репозитория составляющих AST. Т.е. складывать их в какие нибудь общие списки по типам, а между собой просто указателями ликовать. Тогда нет необходимости уничтожения в иерархически порядке, все автоматически освободится при очистке репозитория.
Re: parser generator
От: 0xDEADBEEF Ниоткуда  
Дата: 03.05.12 21:20
Оценка:
Здравствуйте, ival, Вы писали:

I>но в нем %union позволяет хранить только указатели, и поэтому получается много гемороя с memory management.

Я в свое время применял что-то вроде "ручного GC" для этого.
То есть, в %union просто тупо пинал указатели, и заодно сохранял их "сбоку" в векторе для последующего удаления.
В итоге, когда AST переставало быть нужным, я про него его просто "забывал", но зато чистил тот вектор, где все и сидело.
Утечек не было.
__________
16.There is no cause so right that one cannot find a fool following it.
Re: parser generator
От: ival  
Дата: 04.05.12 15:31
Оценка:
Остановился на boost::variant<...> в качестве YYSTYPE
Re: parser generator
От: MTD https://github.com/mtrempoltsev
Дата: 04.05.12 17:36
Оценка:
Здравствуйте, ival, Вы писали:

I>Неподскажите ли LR (1) parser generator под linux в котором можно без гемороя назначать с++ классы к качестве semantic_type к символам грамматики. Провобвал bison, но в нем %union позволяет хранить только указатели, и поэтому получается много гемороя с memory management.


I>Есть ли что-нибудь по-проще?


Bison. В конструктор парсера через передаешь указатель на объект-посредник, потом через этот посредник делаешь все что тебе нужно:

%parse-param { MyProxy* proxy }
%initial-action { Proxy_ = proxy; }

%{
    MyProxy* Proxy_;
%}

%%

text : TEXT { Proxy_->AddText(@1, $1); }
     ;
Re[2]: parser generator
От: sokel Россия  
Дата: 04.05.12 20:22
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Здравствуйте, ival, Вы писали:


I>>но в нем %union позволяет хранить только указатели, и поэтому получается много гемороя с memory management.

DEA>Я в свое время применял что-то вроде "ручного GC" для этого.
DEA>То есть, в %union просто тупо пинал указатели, и заодно сохранял их "сбоку" в векторе для последующего удаления.
DEA>В итоге, когда AST переставало быть нужным, я про него его просто "забывал", но зато чистил тот вектор, где все и сидело.
DEA>Утечек не было.

Лучше список, там указатели не поменяются.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.