The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

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

Приложение 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) [email protected]



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру