[ Содержание ] [ Предыдущая ] [ Следующая ]
В этом приложении находится описание входного синтаксиса Yacc-а в виде спецификации Yacc-а. Контекстные зависимости и т.д. не учитываются. По иронии спецификация входного языка Yacc-а наиболее естественно представляется в виде грамматики LR [2]; неприятная часть начинается, когда идентификатор находится в правиле и за ним немедленно следует действие. Если за эти идентификатором следует двоеточие, то это - начало следующего правила; в противном случае - это продолжение текущего правила, в котором содержится действие. Лексический анализатор смотрит вперед после того, как увидит идентификатор и решает, является ли следующий токен (пропуская пробелы, новые строки, комментарии и т.д.) двоеточием. Если является, то возвращает токен C_IDENTIFIER. В противном случае он возвращает IDENTIFIER. Литералы (строки в кавычках) также возвращаются как IDENTIFIER-ы, но никогда не как часть C_IDENTIFIER-ов.
/* грамматика входных данных Yacc-а */
/* первичные сущности */
/* включает в себя идентификаторы и литералы */
%token IDENTIFIER
/* идентификатор (но не литерал),
за которым следует двоеточие */
%token C_IDENTIFIER
%token NUMBER /* [0-9]+ */
/* зарезервированные слова:
%type => TYPE,
%left => LEFT, и т.д. */
%token LEFT RIGHT NONASSOC TOKEN PREC TYPE START UNION
%token MARK /* отметка %% */
%token LCURL /* отметка %{ */
%token RCURL /* отметка %} */
/* литералы - ascii символы обозначают сами себя */
%start spec
%%
spec
: defs MARK rules tail
;
tail
: MARK
{ В этом действии проглачивается остаток правила }
| /* пустое: второй MARK необязателен */
;
defs : /* пусто */
| defs def
;
def
: START IDENTIFIER
| UNION
{ Скопировать определение union в выходной файл }
| LCURL { Скопировать код на C в выходной файл } RCURL
| ndefs rword tag nlist
;
rword
: TOKEN
| LEFT
| RIGHT
| NONASSOC
| TYPE
;
tag
: /* пусто: тег union'а необязателен */
| '<' IDENTIFIER '>'
;
nlist
: nmno
| nlist nmno
| nlist ',' nmno
;
nmno
: IDENTIFIER /* ЗАМЕЧАHИЕ: литералы запрещены с %type */
| IDENTIFIER NUMBER /* ЗАМЕЧАHИЕ: запрещено с %type */
;
/* секция правил */
rules
: C_IDENTIFIER rbody prec
| rules rule
;
rule
: C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody
: /* empty */
| rbody IDENTIFIER
| rbody act
;
act
: '{'
{ Скопировать действия, транслировать $$, и т.д. } '}'
;
prec
: /* пусто */
| PREC IDENTIFIER
| PREC IDENTIFIER act
| prec ';'
;
[ Содержание ] [ Предыдущая ] [ Следующая ]
c 1998-2000 SoloTony (Antonio Solo) | solotony@mail.ru |