summaryrefslogtreecommitdiff
path: root/support/tools/Burg/gram.y
diff options
context:
space:
mode:
Diffstat (limited to 'support/tools/Burg/gram.y')
-rw-r--r--support/tools/Burg/gram.y90
1 files changed, 90 insertions, 0 deletions
diff --git a/support/tools/Burg/gram.y b/support/tools/Burg/gram.y
new file mode 100644
index 0000000000..f6f16faf8e
--- /dev/null
+++ b/support/tools/Burg/gram.y
@@ -0,0 +1,90 @@
+%{
+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); }
+ ;