diff options
author | Calvin <calvin@EESI> | 2013-03-15 15:26:20 -0400 |
---|---|---|
committer | Calvin <calvin@EESI> | 2013-03-15 15:26:20 -0400 |
commit | b632667ce57af89691407bb8668e1512775278ae (patch) | |
tree | b5742cef185f1cc4a7ba6005b5b4116ce7558a01 /src/nbc/substitution.lex | |
parent | 39e39f82cc38d71018882b0aaaf58255858a7c56 (diff) |
nbc added
Diffstat (limited to 'src/nbc/substitution.lex')
-rw-r--r-- | src/nbc/substitution.lex | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/nbc/substitution.lex b/src/nbc/substitution.lex new file mode 100644 index 0000000..e460121 --- /dev/null +++ b/src/nbc/substitution.lex @@ -0,0 +1,54 @@ +type svalue = Tokens.svalue +type ('a, 'b) token = ('a, 'b) Tokens.token +type pos = int +type lexresult = (svalue, pos) token +type arg = int ref +fun eof _ = Tokens.EOF (~1, ~1) +%% +%full +%header (functor SubstitutionLexFun (structure Tokens: SubstitutionGrm_TOKENS)); +%arg (nesting); +%s VARIABLE PARENTHESIZED BRACED; +text = ([^$] | "\\$")+; +dollar = "$"; +leftparenthesis = "("; +rightparenthesis = ")"; +notparenthesis = [^()]+; +leftbrace = "{"; +rightbrace = "}"; +notbrace = [^{}]+; +other = [A-Za-z0-9_]+; +%% +<INITIAL>{text} => (Tokens.TEXT (yytext, yypos, yypos + size yytext)); +<INITIAL>{dollar} => (YYBEGIN VARIABLE; Tokens.DOLLAR (yypos, yypos + 1)); +<INITIAL>{dollar}{leftparenthesis} => ( + YYBEGIN PARENTHESIZED + ; nesting := !nesting + 1 + ; Tokens.LEFT_PARENTHESIS (yypos, yypos + 1) +); +<INITIAL>{dollar}{leftbrace} => ( + YYBEGIN BRACED + ; nesting := !nesting + 1 + ; Tokens.LEFT_BRACE (yypos, yypos + 1) +); +<VARIABLE>{other} => (YYBEGIN INITIAL; Tokens.TEXT (yytext, yypos, yypos + size yytext)); +<PARENTHESIZED>{notparenthesis} => (Tokens.TEXT (yytext, yypos, yypos + size yytext)); +<PARENTHESIZED>{leftparenthesis} => ( + nesting := !nesting + 1 + ; Tokens.LEFT_PARENTHESIS (yypos, yypos + 1) +); +<PARENTHESIZED>{rightparenthesis} => ( + nesting := !nesting - 1 + ; if !nesting = 0 then YYBEGIN INITIAL else () + ; Tokens.RIGHT_PARENTHESIS (yypos, yypos + 1) +); +<BRACED>{notbrace} => (Tokens.TEXT (yytext, yypos, yypos + size yytext)); +<BRACED>{leftbrace} => ( + nesting := !nesting + 1 + ; Tokens.LEFT_BRACE (yypos, yypos + 1) +); +<BRACED>{rightbrace} => ( + nesting := !nesting - 1 + ; if !nesting = 0 then YYBEGIN INITIAL else () + ; Tokens.RIGHT_BRACE (yypos, yypos + 1) +); |