Сейчас на форуме: 2nd, morgot, Rio, CDK123, zds, tyns777, tihiy_grom (+5 невидимых)

 eXeL@B —› Программирование —› Реверсинг YACC и LEX.
Посл.ответ Сообщение


Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 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





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 02 марта 2009 21:53
· Личное сообщение · #2

Ну имена правил ты не востановишь, их просто нету в коде (если конечно это не debug версия). В Си коде будут таблицы, так что зная использованный скелет ты сможешь расписасть все shift/reduce привила на бумажке и потом привести это к bison/yacc нотации. Это если есть исходник...




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 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





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 04 марта 2009 20:06
· Личное сообщение · #4

OKOB пишет:
Эти полные таблицы и содержат shift/reduce привила. Не за горами уже и yacc нотация (надеюсь).

Кста, скомпиль пару примеров и посмотри как именно этот кодо-геренатор превращает правила в таблицы. Дело в том, что одно дело расписать граматику в таблицу (то есть переходы в state machine) а другое создать таблицы для LR или LALR parser. Первое это как бы логический исходник, а второе - оптимизированная/транслированная реализация.


 eXeL@B —› Программирование —› Реверсинг YACC и LEX.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати