Можно ли перейти на другое правило - PullRequest
0 голосов
/ 01 декабря 2019

Насколько я понимаю, в Lex / Bison лексический анализ выполняется с помощью lex, синтаксический - по правилам Bison, а семантический - по действиям Bison.

Возможно ли перейтиВернемся к семантическому анализу, то есть действиям, к синтаксическому анализу?

Один из примеров может быть следующим: предположим, я хочу иметь возможность обнаруживать псевдо-C как "i ++", "i = i + 1", "I = I + 2". Но я хочу, чтобы «i = i + 1» было сокращено до «i ++», а «i = i + 2» - для второго правила. Можно ли сделать что-то подобное:

identifier_plusplus: IDENTIFIER '+' '+'
add:                 IDENTIFIER '=' IDENTIFIER '+' NUMBER {if($1 == $3 && $5 == 1) REDUCE_IN(identifier_plusplus);}

Здесь это не очень полезно, но в случае, когда я использую identifier_plusplus в другом правиле, это может быть очень мощным.

РЕДАКТИРОВАТЬ: Пример, где это может быть полезно, будет, если у меня есть другое правило, которое ловит для циклов, которые увеличивают один за другим. Я хотел бы напечатать что-нибудь как:

for_one:    FOR '(' IDENTIFIER '=' '0' ';' IDENTIFIER '<' CONST ';' IDENTIFIER PLUSPLUS ')' exprs 

Не заботясь, написал ли я i ++ или i = i + 1.

Это более понятно сейчас? (прошу прощения за мой английский ...)

Заранее спасибо.

1 Ответ

0 голосов
/ 02 декабря 2019

В общих чертах, вы должны избегать путаницы синтаксиса с семантикой, как в реализации вашего компилятора, так и в дизайне вашего языка.

Синтаксического анализа входных данных должно быть достаточно для построения дерева разбора изправильные входы. Семантический анализ, такой как преобразование, предложенное в вашем вопросе, может быть легко выполнен путем последовательных обходов дерева разбора.

При таком разделении синтаксиса и семантики получается код, который становится более понятным и более обслуживаемым, и облегчает внедрение дополнительных функций, таких как новые оптимизации или статический анализ. Кроме того, общеизвестно, что при разборе генерируются полезные сообщения об ошибках;гораздо проще точно сообщать об ошибках, обнаруженных во время семантического анализа, таких как несоответствия типов.

С учетом всего этого, bison предоставляет возможность генерировать анализатор GLR, предоставляя более гибкий диапазон возможностей для разрешения конфликтов синтаксического анализа. ,Поскольку грамматика с двумя возможными сокращениями для одной и той же правой части обязательно имеет неоднозначность, вы можете использовать пользовательских функций слияния , чтобы выбрать сокращение на основе семантических значений компонентов. Генератор GLR Бизона также включает в себя расширение, которое позволяет охранять продукцию с помощью семантического предиката .

. Эти расширенные функции могут использоваться для преимуществ в языках, синтаксис которых необоснованно обусловлен семантическим анализом, включаяязыки, которые обычно анализируются с использованием некоторой «лексической обратной связи». (В идеале языки должны были бы быть определены таким образом, чтобы не полагаться на такие хаки, но дизайн языка не всегда идеален.) В некоторых случаях решение GLR может упростить такие парсеры, но важно тщательно учитывать ограничения, особенновлияние отложенного выполнения действий парсера.

...