Насколько я понимаю, в 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.
Это более понятно сейчас? (прошу прощения за мой английский ...)
Заранее спасибо.