![]() |
eXeL@B —› Программирование —› Реверсинг YACC и LEX. |
Посл.ответ | Сообщение |
|
Создано: 02 марта 2009 00:44 · Личное сообщение · #1 Всем известны YACC и LEX. Так вот реверсю один проект, где парсер сделан на основе TP Yacc V3.0. Хотелось бы восстановить не исходный код парсера, а исходную граматику положенную в парсер (понятно без реальных имен токенов и правил). Почитал все про YACC и LEX, про LARL(1)-разбор, Ахо-Сети-Ульмана, но идей не появилось. Есть восстановленные все таблицы парсера: yya : array [1..yynacts] of YYARec yyg : array [1..yyngotos] of YYARec yyd : array [0..yynstates-1] of Integer yyal : array [0..yynstates-1] of Integer yyah : array [0..yynstates-1] of Integer yygl : array [0..yynstates-1] of Integer yygh : array [0..yynstates-1] of Integer yyr : array [1..yynrules] of YYRRec Может кто подобным занимался, или в сети есть инструменты для этого. Это наверняка возможно ведь процесс обработки файлов *.l и *.y однозначный. ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 02 марта 2009 21:53 · Личное сообщение · #2 |
|
Создано: 03 марта 2009 11:38 · Личное сообщение · #3 s0larian пишет: Ну имена правил ты не востановишь, их просто нету в коде я так и написал - понятно без реальных имен токенов и правил s0larian пишет: В Си коде будут таблицы Парсер Паскально-Дельфийный (TP Yacc V3.0) и все исходные таблицы уже восстановил. Известно количество правил, состояний, действий и переходов. Теперь уже расжимаю таблицы yyal, yyah, yya -> action table; yygl, yygh, yyg -> goto table. Эти полные таблицы и содержат shift/reduce привила. Не за горами уже и yacc нотация (надеюсь). Удивительно то, что сколько ни гуглил нет описания подобной методики восстановления, а тем более инструментария. А речь идет о виртуализаторе Фимки. ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 04 марта 2009 20:06 · Личное сообщение · #4 OKOB пишет: Эти полные таблицы и содержат shift/reduce привила. Не за горами уже и yacc нотация (надеюсь). Кста, скомпиль пару примеров и посмотри как именно этот кодо-геренатор превращает правила в таблицы. Дело в том, что одно дело расписать граматику в таблицу (то есть переходы в state machine) а другое создать таблицы для LR или LALR parser. Первое это как бы логический исходник, а второе - оптимизированная/транслированная реализация. ![]() |
![]() |
eXeL@B —› Программирование —› Реверсинг YACC и LEX. |