summaryrefslogtreecommitdiffstats
path: root/llvm/utils/Burg/gram.yc
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/Burg/gram.yc')
-rw-r--r--llvm/utils/Burg/gram.yc91
1 files changed, 91 insertions, 0 deletions
diff --git a/llvm/utils/Burg/gram.yc b/llvm/utils/Burg/gram.yc
new file mode 100644
index 00000000000..9d2f9f4e53f
--- /dev/null
+++ b/llvm/utils/Burg/gram.yc
@@ -0,0 +1,91 @@
+%{
+char rcsid_gram[] = "$Id$";
+
+#include <stdio.h>
+#include "b.h"
+#include "fe.h"
+int doGram(List);
+%}
+
+%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); }
+ ;
OpenPOWER on IntegriCloud