diff options
Diffstat (limited to 'llvm/utils/Burg/gram.yc')
| -rw-r--r-- | llvm/utils/Burg/gram.yc | 91 |
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); } + ; |

