[llvm-commits] CVS: llvm/test/Programs/MultiSource/Applications/d/grammar.g
John Criswell
criswell at cs.uiuc.edu
Mon Mar 1 10:17:01 PST 2004
Changes in directory llvm/test/Programs/MultiSource/Applications/d:
grammar.g added (r1.1)
---
Log message:
Test input file that I forgot to commit.
Lo siento.
---
Diffs of the changes: (+185 -0)
Index: llvm/test/Programs/MultiSource/Applications/d/grammar.g
diff -c /dev/null llvm/test/Programs/MultiSource/Applications/d/grammar.g:1.1
*** /dev/null Mon Mar 1 10:16:34 2004
--- llvm/test/Programs/MultiSource/Applications/d/grammar.g Mon Mar 1 10:16:24 2004
***************
*** 0 ****
--- 1,185 ----
+ /*
+ Grammar Grammar
+ */
+ {
+ #include "gramgram.h"
+ #include "d.h"
+ }
+
+ grammar: global_code* (production global_code*)+;
+
+ global_code: curly_code {
+ add_global_code($g, $n0.start_loc.s+1, $n0.end-1,
+ $n0.start_loc.line);
+ }
+ | '${scanner' balanced_code+ '}' {
+ $g->scanner.code = dup_str($n1.start_loc.s, $n1.end);
+ $g->scanner.line = $n0.start_loc.line;
+ }
+ | '${declare' declarationtype identifier* '}' {
+ if (!d_get_number_of_children(&$n2))
+ add_declaration($g, $n2.start_loc.s, $n2.end, $1.kind, $n2.start_loc.line);
+ else {
+ int i, n = d_get_number_of_children(&$n2);
+ for (i = 0; i < n; i++) {
+ D_ParseNode *pn = d_get_child(&$n2, i);
+ add_declaration($g, pn->start_loc.s, pn->end, $1.kind, pn->start_loc.line);
+ }
+ }
+ }
+ | '${token' token_identifier+ '}'
+ | '${action}' { $g->action_index++; }
+ | '${pass' identifier pass_types '}' {
+ add_pass($g, $n1.start_loc.s, $n1.end, $2.kind, $n1.start_loc.line);
+ }
+ ;
+
+ pass_types:
+ | pass_type pass_types { $$.kind = $0.kind | $1.kind; }
+ ;
+
+ pass_type : 'preorder' { $$.kind |= D_PASS_PRE_ORDER; }
+ | 'postorder' { $$.kind |= D_PASS_POST_ORDER; }
+ | 'manual' { $$.kind |= D_PASS_MANUAL; }
+ | 'for_all' { $$.kind |= D_PASS_FOR_ALL; }
+ | 'for_undefined' { $$.kind |= D_PASS_FOR_UNDEFINED; }
+ ;
+
+ declarationtype: 'tokenize' { $$.kind = DECLARE_TOKENIZE; }
+ | 'longest_match' { $$.kind = DECLARE_LONGEST_MATCH; }
+ | 'whitespace' { $$.kind = DECLARE_WHITESPACE; }
+ | 'all_matches' { $$.kind = DECLARE_ALL_MATCHES; }
+ | 'set_op_priority_from_rule' { $$.kind = DECLARE_SET_OP_PRIORITY; }
+ | 'all_subparsers' { $$.kind = DECLARE_STATES_FOR_ALL_NTERMS; }
+ | 'subparser' { $$.kind = DECLARE_STATE_FOR; }
+ | 'save_parse_tree' { $$.kind = DECLARE_SAVE_PARSE_TREE; }
+ ;
+
+ token_identifier: identifier { new_token($g, $n0.start_loc.s, $n0.end); };
+
+ production : production_name ':' rules ';'
+ | production_name regex_production rules ';'
+ | ';';
+ regex_production : '::=' { $g->p->regex = 1; };
+
+ production_name : (identifier | '_')
+ { $g->p = new_production($g, dup_str($n0.start_loc.s, $n0.end)); }
+ ;
+
+ rules : rule ('|' rule)*;
+
+ rule : new_rule ((element element_modifier*)* simple_element element_modifier*)? rule_modifier* rule_code {
+ vec_add(&$g->p->rules, $g->r);
+ };
+
+ new_rule : { $g->r = new_rule($g, $g->p); };
+
+ simple_element
+ : string { $g->e = new_string($g, $n0.start_loc.s, $n0.end, $g->r); }
+ | regex { $g->e = new_string($g, $n0.start_loc.s, $n0.end, $g->r); }
+ | identifier { $g->e = new_ident($n0.start_loc.s, $n0.end, $g->r); }
+ | '${scan' balanced_code+ '}' { $g->e = new_code($g, $n1.start_loc.s, $n1.end, $g->r); }
+ | '(' new_subrule rules ')' {
+ $g->e = new_elem_nterm($g->p, $1.r);
+ $g->p = $1.p;
+ $g->r = $1.r;
+ vec_add(&$g->r->elems, $g->e);
+ }
+ ;
+
+ element
+ : simple_element
+ | bracket_code {
+ Production *p = new_internal_production($g, NULL);
+ Rule *r = new_rule($g, p);
+ vec_add(&p->rules, r);
+ r->speculative_code.code = dup_str($n0.start_loc.s + 1, $n0.end - 1);
+ r->speculative_code.line = $n0.start_loc.line;
+ $g->e = new_elem_nterm(p, $g->r);
+ vec_add(&$g->r->elems, $g->e);
+ }
+ | curly_code {
+ Production *p = new_internal_production($g, NULL);
+ Rule *r = new_rule($g, p);
+ vec_add(&p->rules, r);
+ r->final_code.code = dup_str($n0.start_loc.s + 1, $n0.end - 1);
+ r->final_code.line = $n0.start_loc.line;
+ $g->e = new_elem_nterm(p, $g->r);
+ vec_add(&$g->r->elems, $g->e);
+ }
+ ;
+
+ new_subrule : {
+ $$.p = $g->p;
+ $$.r = $g->r;
+ $g->p = new_internal_production($g, $g->p);
+ $g->r = new_rule($g, $g->p);
+ };
+
+ element_modifier
+ : '$term' integer {
+ if ($g->e->kind != ELEM_TERM)
+ d_fail("terminal priority on non-terminal");
+ $g->e->e.term->term_priority = strtol($n1.start_loc.s, NULL, 0);
+ }
+ | '/i' {
+ if ($g->e->kind != ELEM_TERM)
+ d_fail("ignore-case (/i) on non-terminal");
+ $g->e->e.term->ignore_case = 1;
+ }
+ | '?' { conditional_EBNF($g); }
+ | '*' { star_EBNF($g); }
+ | '+' { plus_EBNF($g); } ;
+
+ rule_modifier : rule_assoc rule_priority;
+
+ rule_assoc
+ : '$unary_op_right' { $g->r->op_assoc = ASSOC_UNARY_RIGHT; }
+ | '$unary_op_left' { $g->r->op_assoc = ASSOC_UNARY_LEFT; }
+ | '$binary_op_right' { $g->r->op_assoc = ASSOC_BINARY_RIGHT; }
+ | '$binary_op_left' { $g->r->op_assoc = ASSOC_BINARY_LEFT; }
+ | '$unary_right' { $g->r->rule_assoc = ASSOC_UNARY_RIGHT; }
+ | '$unary_left' { $g->r->rule_assoc = ASSOC_UNARY_LEFT; }
+ | '$binary_right' { $g->r->rule_assoc = ASSOC_BINARY_RIGHT; }
+ | '$binary_left' { $g->r->rule_assoc = ASSOC_BINARY_LEFT; }
+ | '$right' { $g->r->rule_assoc = ASSOC_NARY_RIGHT; }
+ | '$left' { $g->r->rule_assoc = ASSOC_NARY_LEFT; }
+ ;
+
+ rule_priority : integer {
+ if ($g->r->op_assoc) $g->r->op_priority = strtol($n0.start_loc.s, NULL, 0);
+ else $g->r->rule_priority = strtol($n0.start_loc.s, NULL, 0);
+ };
+
+ rule_code : speculative_code? final_code? pass_code* ;
+
+ speculative_code : bracket_code {
+ $g->r->speculative_code.code = dup_str($n0.start_loc.s + 1, $n0.end - 1);
+ $g->r->speculative_code.line = $n0.start_loc.line;
+ };
+
+ final_code : curly_code {
+ $g->r->final_code.code = dup_str($n0.start_loc.s + 1, $n0.end - 1);
+ $g->r->final_code.line = $n0.start_loc.line;
+ };
+
+ pass_code : identifier ':' curly_code {
+ add_pass_code($g, $g->r, $n0.start_loc.s, $n0.end, $n2.start_loc.s+1,
+ $n2.end-1, $n0.start_loc.line, $n2.start_loc.line);
+ };
+
+ curly_code: '{' balanced_code* '}';
+ bracket_code: '[' balanced_code* ']';
+ balanced_code : '(' balanced_code* ')'
+ | '[' balanced_code* ']'
+ | '{' balanced_code* '}'
+ | string | identifier | regex | integer | symbols;
+ symbols : "[!~`@#$%^&*\-_+=|:;\\<,>.?/]";
+ string: "'([^'\\]|\\[^])*'";
+ regex: "\"([^\"\\]|\\[^])*\"";
+ identifier: "[a-zA-Z_][a-zA-Z_0-9]*" $term -1;
+ integer: decimalint | hexint | octalint;
+ decimalint: "-?[1-9][0-9]*[uUlL]?";
+ hexint: "-?(0x|0X)[0-9a-fA-F]+[uUlL]?";
+ octalint: "-?0[0-7]*[uUlL]?";
+
More information about the llvm-commits
mailing list