diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2009-11-02 13:58:30 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2009-11-02 13:58:30 -0800 |
commit | 6191fbb2ca7a9ac339dd3994bdea8273ceb0a24d (patch) | |
tree | 3ddb47f26c66c5e4d09dd87f4518468f489f84a3 /parser.y | |
parent | 4b493073a6deafa6b4ac6386a0eab034e0e20082 (diff) | |
download | txr-6191fbb2ca7a9ac339dd3994bdea8273ceb0a24d.tar.gz txr-6191fbb2ca7a9ac339dd3994bdea8273ceb0a24d.tar.bz2 txr-6191fbb2ca7a9ac339dd3994bdea8273ceb0a24d.zip |
Start of implementation for freestyle matching.
Lazy strings implemented, incompletely.
Changed string function to implicitly strdup; non-strdup
version changed to string_own. Fixed wrong uses of strdup
rather than chk_strdup.
Functions added to regex module to provide regex matching
as a state machine to which characters are fed.
Diffstat (limited to 'parser.y')
-rw-r--r-- | parser.y | 37 |
1 files changed, 23 insertions, 14 deletions
@@ -183,7 +183,7 @@ elems : elem { $$ = cons($1, nil); } yyerror("rep outside of output"); } ; -elem : TEXT { $$ = string($1); } +elem : TEXT { $$ = string_own($1); } | var { $$ = $1; } | list { $$ = $1; } | regex { $$ = cons(regex_compile($1), $1); } @@ -347,7 +347,7 @@ o_elems : o_elem { $$ = cons($1, nil); } | o_elem o_elems { $$ = cons($1, $2); } ; -o_elem : TEXT { $$ = string($1); } +o_elem : TEXT { $$ = string_own($1); } | var { $$ = $1; } | rep_elem { $$ = $1; } ; @@ -372,23 +372,32 @@ rep_parts_opt : SINGLE o_elems_opt2 /* This sucks, but factoring '*' into a nonterminal * that generates an empty phrase causes reduce/reduce conflicts. */ -var : IDENT { $$ = list(var, intern(string($1)), nao); } - | IDENT elem { $$ = list(var, intern(string($1)), $2, nao); } - | '{' IDENT '}' { $$ = list(var, intern(string($2)), nao); } - | '{' IDENT '}' elem { $$ = list(var, intern(string($2)), $4, nao); } - | '{' IDENT regex '}' { $$ = list(var, intern(string($2)), +var : IDENT { $$ = list(var, intern(string_own($1)), + nao); } + | IDENT elem { $$ = list(var, intern(string_own($1)), + $2, nao); } + | '{' IDENT '}' { $$ = list(var, intern(string_own($2)), + nao); } + | '{' IDENT '}' elem { $$ = list(var, intern(string_own($2)), + $4, nao); } + | '{' IDENT regex '}' { $$ = list(var, intern(string_own($2)), nil, cons(regex_compile($3), $3), nao); } - | '{' IDENT NUMBER '}' { $$ = list(var, intern(string($2)), + | '{' IDENT NUMBER '}' { $$ = list(var, intern(string_own($2)), nil, num($3), nao); } - | var_op IDENT { $$ = list(var, intern(string($2)), + | var_op IDENT { $$ = list(var, intern(string_own($2)), nil, $1, nao); } - | var_op IDENT elem { $$ = list(var, intern(string($2)), + | var_op IDENT elem { $$ = list(var, intern(string_own($2)), $3, $1, nao); } - | var_op '{' IDENT '}' { $$ = list(var, intern(string($3)), + | var_op '{' IDENT '}' { $$ = list(var, intern(string_own($3)), nil, $1, nao); } - | var_op '{' IDENT '}' elem { $$ = list(var, intern(string($3)), + | var_op '{' IDENT '}' elem { $$ = list(var, intern(string_own($3)), $5, $1, nao); } + | var_op '{' IDENT regex '}' { yyerror("longest match " + "not useable with regex"); } + | var_op '{' IDENT NUMBER '}' { yyerror("longest match " + "not useable with " + "fixed width match"); } | IDENT error { $$ = nil; yybadtoken(yychar, "variable spec"); } | var_op error { $$ = nil; @@ -409,7 +418,7 @@ exprs : expr { $$ = cons($1, nil); } | expr '.' expr { $$ = cons($1, $3); } ; -expr : IDENT { $$ = intern(string($1)); } +expr : IDENT { $$ = intern(string_own($1)); } | NUMBER { $$ = num($1); } | list { $$ = $1; } | regex { $$ = cons(regex_compile($1), $1); } @@ -502,7 +511,7 @@ quasi_items : quasi_item { $$ = cons($1, nil); } ; quasi_item : litchars { $$ = lit_char_helper($1); } - | TEXT { $$ = string($1); } + | TEXT { $$ = string_own($1); } | var { $$ = $1; } | list { $$ = $1; } ; |