2002-09-18 01:03:30 +02:00
|
|
|
%{
|
|
|
|
char rcsid_gram[] = "$Id$";
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "b.h"
|
|
|
|
#include "fe.h"
|
2002-09-22 04:40:40 +02:00
|
|
|
int doGram(List);
|
2002-09-18 01:03:30 +02:00
|
|
|
%}
|
|
|
|
|
|
|
|
%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); }
|
|
|
|
;
|