[ Содержание ] [ Предыдущая ] [ Следующая ]

Приложение B: Входной синтаксис Yacc-а

    В этом приложении находится описание входного синтаксиса 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