blob: f6f16faf8efcde4705b6c55a9e6838916e718094 [file] [log] [blame]
%{
char rcsid_gram[] = "$Id$";
#include <stdio.h>
#include "b.h"
#include "fe.h"
%}
%union {
int y_int;
char *y_string;
Arity y_arity;
Binding y_binding;
PatternAST y_patternAST;
RuleAST y_ruleAST;
List y_list;
IntList y_intlist;
}
%start full
%term ERROR
%term K_TERM
%term K_GRAM
%term K_START
%term K_PPERCENT
%term INT
%term ID
%token <y_string> ID
%token <y_int> INT
%type <y_arity> decl
%type <y_binding> binding
%type <y_intlist> cost costtail
%type <y_ruleAST> rule
%type <y_patternAST> pattern
%type <y_list> decls rules bindinglist grammarlist
%%
full : spec
| spec K_PPERCENT
{ yyfinished(); }
;
spec : decls K_PPERCENT rules
= { doSpec($1, $3); }
;
decls : /* lambda */ = { $$ = 0; }
| decls decl = { $$ = newList($2, $1); }
;
decl : K_TERM bindinglist = { $$ = newArity(-1, $2); }
| K_GRAM grammarlist = { $$ = 0; doGram($2); }
| K_START ID = { $$ = 0; doStart($2); } /* kludge */
;
grammarlist : /* lambda */ = { $$ = 0; }
| grammarlist ID = { $$ = newList($2, $1); }
;
bindinglist : /* lambda */ = { $$ = 0; }
| bindinglist binding = { $$ = newList($2, $1); }
;
binding : ID '=' INT = { $$ = newBinding($1, $3); }
;
rules : /* lambda */ = { $$ = 0; }
| rules rule = { $$ = newList($2, $1); }
;
rule : ID ':' pattern '=' INT cost ';' = { $$ = newRuleAST($1, $3, $5, $6); }
;
pattern : ID = { $$ = newPatternAST($1, 0); }
| ID '(' pattern ')' = { $$ = newPatternAST($1, newList($3,0)); }
| ID '(' pattern ',' pattern ')' = { $$ = newPatternAST($1, newList($3, newList($5, 0))); }
;
cost : /* lambda */ = { $$ = 0; }
| '(' INT costtail ')' = { $$ = newIntList($2, $3); }
;
costtail : /* lambda */ = { $$ = 0; }
| ',' INT costtail = { $$ = newIntList($2, $3); }
| INT costtail = { $$ = newIntList($1, $2); }
;