summaryrefslogtreecommitdiff
path: root/sh9parser.b
diff options
context:
space:
mode:
Diffstat (limited to 'sh9parser.b')
-rw-r--r--sh9parser.b130
1 files changed, 0 insertions, 130 deletions
diff --git a/sh9parser.b b/sh9parser.b
deleted file mode 100644
index fcae119..0000000
--- a/sh9parser.b
+++ /dev/null
@@ -1,130 +0,0 @@
-implement Sh9Parser;
-
-include "sys.m";
-include "sh9parser.m";
-include "sh9util.m";
-
-sys: Sys;
-S_UNKNOWN: con "UNK";
-
-sh9u: Sh9Util;
-
-reverse_list: import sh9u;
-to_array: import sh9u;
-
-GrammarNode.print_expr(gn: self ref GrammarNode) {
- lg:= len gn.expr;
- for (i:=0; i<lg; i++) {
- sys->print("%s ", gn.expr[i]);
- }
- if (gn.transform == S_UNKNOWN) {
- sys->print("\n");
- } else {
- sys->print("-> %s\n", gn.transform);
- }
-}
-
-mk_tok(start: int, line: int, tok: string, typ: string) : TokNode {
- tok_node: TokNode;
- tok_node.start = start;
- tok_node.line = line;
- tok_node.tok = tok;
- tok_node.typ = typ;
- return tok_node;
-}
-
-set_last_tok(last_tok: ref TokNode, toks: list of ref TokNode): (TokNode, list of ref TokNode) {
- ret_tok: TokNode;
- ret_tok = *last_tok;
- if (last_tok.typ != S_UNKNOWN) {
- toks = last_tok :: toks;
- ret_tok.typ = S_UNKNOWN;
- ret_tok.start = -1;
- ret_tok.tok = "";
- ret_tok.line = -1;
- }
- return (ret_tok, toks);
-}
-
-print_toks(toks: array of ref TokNode) {
- lt := len toks;
- for (i := 0; i < lt; i ++) {
- tok := toks[i];
- sys->print("[%d/%d] %s (%s)\n", i, lt, tok.typ, tok.tok);
- }
-}
-
-print_toks_short(toks: array of ref TokNode) {
- lt := len toks;
- for (i := 0; i < lt; i ++) {
- tok := toks[i];
- sys->print("%s ", tok.typ);
- }
- sys->print("\n");
-}
-
-check_grammar_node_match(toks: array of ref TokNode, gn: ref GrammarNode): int {
- lt:= len toks;
- lg:= len gn.expr;
- if (lg > lt) {
- return 0;
- }
- #sys->print("Checking grammar ");
- gn.print_expr();
- #sys->print("Against ");
- print_toks(toks);
- for (i:= 0; i < lg; i ++) {
- if (toks[i].typ != gn.expr[i]) {
- return 0;
- }
- }
- return 1;
-}
-
-replace_toks(src: array of ref TokNode, replace_start: int, replace_len: int, replace_with: array of ref TokNode): array of ref TokNode {
- src_len:= len src;
- new_toks: list of ref TokNode;
- with_len:= len replace_with;
- for (i:=0; i<replace_start; i++) {
- new_toks = src[i] :: new_toks;
- }
- for (i=0; i<with_len; i++) {
- new_toks = replace_with[i] :: new_toks;
- }
- for (i=replace_start + replace_len; i<src_len; i++) {
- new_toks = src[i] :: new_toks;
- }
- new_toks = reverse_list(new_toks);
- return to_array(new_toks);
-}
-
-parse_toks(toks: array of ref TokNode, g: array of ref GrammarNode): array of ref TokNode {
- lgns := len g;
- changed := 0;
- ctr := 0;
- do
- {
- lt := len toks;
- sys->print("Loop %d: ", ctr);
- print_toks_short(toks);
- ctr ++;
- changed = 0;
- fast: for (i := 0; i <= lt; i ++) {
- for (j := 0; j < lgns; j++) {
- gj:= g[j];
- if (check_grammar_node_match(toks[lt - i:], gj) == 1) {
- sys->print("Something matched !\n");
- gj.print_expr();
- sys->print("Before replace: ");
- print_toks_short(toks);
- gj.callback(toks[lt-i: lt-i+len gj.expr]);
- toks = replace_toks(toks, lt-i, len gj.expr, array[] of {ref mk_tok(toks[lt - i].start, toks[lt - i].line, "", gj.transform)});
- sys->print("After replace: ");
- changed = 1;
- break fast;
- }
- }
- }
- } while(changed);
- return toks;
-}