2016-04-25 9 views
0

Я смущен между синтаксисом Directed Translation и парсером, написанным с использованием Bison. (Основная путаница заключается в том, состоит ли синтаксический анализатор, написанный в Bison, уже из синтаксического ориентированного переводчика.) Я перефразирую приведенное выше предложение в скобках как (Как Bison реализует синтаксический речевой перевод, связан ли он с помощью Eg $$ = $ 1 + $ 3)Вопросы о синтаксисе с прямым переводом и Bison Parser

Это говорит, что link

код с в действии может относиться к семантическим значениям компонентов подобранных по правилу с конструкцией $ п, которая выступает за значение п-го компоненты. Семантическое значение для строящейся группировки - $$. (Bison переводит обе эти конструкции в ссылки на элементы массива копирует действия в файл анализатора.)

А также в главе 5 (Синтаксис Directed анализа) о book говорит

Грамматика + Семантические правила = Синтаксис Directed Перевод

PRODUCTION   SEMANTIC RULE 
→1 +   {. = 1. ┤| . |′+′} 

при взгляде на следующем фрагменте правил перевода для простого парсера из книги Flex and Bison

%% 
E: F default $$ = $1 
     | E ADD F { $$ = $1 + $3; } 
     | E SUB F { $$ = $1 - $3; } 
    ; 
%% 

ли .code equavelent к $$ Я так растерялся. Является ли синтаксический направленный анализ таким же, как семантический анализ? Чем больше я читаю, тем больше смущаюсь. Кто-то, пожалуйста, помогите мне разобраться.

+0

Возможный дубликат [Что означает синтаксис направленного перевода?] (Http://stackoverflow.com/questions/15984605/what-does-syntax-directed-translation-mean) –

ответ

0

Ваше понимание кажется правильным, но смущает тот факт, что ваш пример из книги Дракона и анализатора примеров выполняет две разные вещи: книга Дракона переводит выражение в код, в то время как простой парсер оценивает выражение , не перевод (так что это действительно синтаксическая направленная оценка, а не синтаксический направленный перевод).

В семантических правилах, описанных в книге Дракона, символы могут иметь несколько атрибутов, как синтезированных, так и унаследованных. Вот что означает суффикс .code - его атрибут символов, к которому он применяется. Bison, с другой стороны, позволяет каждому символу иметь сингл - не более и не унаследованные атрибуты. Если вы хотите несколько attrbutes, вы можете собрать их вместе в struct и использовать это как свой атрибут (требуется некоторое тщательное управление). Если вы хотите унаследованные атрибуты, вы можете использовать $0 и даже более тщательное управление, или вы можете использовать глобальные переменные, чтобы получить тот же эффект.

Бизон сниппет, который будет соответствовать вашему Dragon книга примера фрагмент кода будет что-то вроде:

E : E ADD F { $$ = AppendCode($1, $3, PLUS); } 

с использованием одного бизона атрибута для атрибута .code и делать операцию на добавление для кода генерируется как функция ,