Mercurial > repos > rhope
diff lex.rhope @ 2:73e978d590c7
Adding WIP compiler code
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 29 Apr 2009 02:58:03 -0400 |
parents | |
children | 0a4682be2db2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lex.rhope Wed Apr 29 02:58:03 2009 -0400 @@ -0,0 +1,188 @@ +Import extendlib.rhope + +Blueprint Token +{ + Type + Raw Text + Text +} + +Token[type,raw,text:out] +{ + out <- [[[Build["Token"]]Type <<[type]]Raw Text <<[raw]]Text <<[text] +} + +_Type Match[val, test type, type:out] +{ + If[[test type]=[type]] + { + out <- Yes + }{ + out <- Val[val] + } +} + +Type Match@Token[token,type:match,nomatch] +{ + match,nomatch <- If[Fold[["_Type Match"]Set Input[2, [token]Type >>], No, As List[type]]] +} + +String Literal[string, raw string, escapes, text, simple tokens, token list:out] +{ + first,rest <- [text]Slice[1] + If[[first] = ["\""]] + { + out <- _Lex[rest, [first]Slice[0], simple tokens, [token list]Append[Token["String Literal", raw string, string]]] + }{ + next raw <- [raw string]Append[first] + If[[first] = ["\\"]] + { + second,next text <- [rest]Slice[1] + char <- [escapes]Index[To String[second]] {} + { + char <- Val[second] + } + next string <- [string]Append[char] + }{ + next string <- [string]Append[first] + next text <- Val[rest] + } + out <- String Literal[next string, next raw, escapes, next text, simple tokens, token list] + } +} + +Line Comment[start comment, text, simple tokens, token list:out] +{ + next text, comment <- [text]Get DString["\n"] {} {} {} + { + next text <- "" + } + out <- _Lex[next text, [next text]Slice[0], simple tokens, [token list]Append[Token["Line Comment", [start comment]Append[comment], comment]]] + +} + +Block Comment[comment,raw comment, depth, text, simple tokens, token list:out] +{ + Print[["Block Comment: Depth="]Append[depth]] + If[[depth] > [0]] + { + next text, chunk, delim <- [text]Get DString[("/*","*/")] {} {} {} + { + next text <- "" + delim <- "" + } + If[[delim] = ["/*"]] + { + next depth <- [depth] + [1] + }{ + next depth <- [depth] - [1] + } + If[[next depth] = [0]] + { + next comment <- [comment]Append[chunk] + }{ + next comment <- [[comment]Append[chunk]]Append[delim] + } + out <- Block Comment[next comment, [[raw comment]Append[chunk]]Append[delim], next depth, next text, simple tokens, token list] + }{ + out <- _Lex[text, [raw comment]Slice[0], simple tokens, [token list]Append[Token["Block Comment", raw comment, comment]]] + } +} + +Numeric Literal[literal, text, simple tokens, token list:out] +{ + first,rest <- [text]Slice[1] + If[[first] In ["01234567890.x"]] + { + out <- Numeric Literal[[literal]Append[first], rest, simple tokens, token list] + }{ + out <- _Lex[text, [first]Slice[0], simple tokens, [token list]Append[Token["Numeric Literal", literal, literal]]] + } +} + +Add Token[token, text, simple tokens, token list:out] +{ + out <- _Lex[text, [text]Slice[0], simple tokens, [token list]Append[token]] +} + +_Lex[text, symbol, simple tokens,token list:out] +{ + If[[[text]Length] > [0]] + { + first,rest <- [text]Slice[1] + [simple tokens]Index[To String[first]] + { + token worker <- [["Add Token"]Set Input[0, Token[~, first, ""]]]Set Input[1, rest] + }{ + If[[first] = ["\""]] + { + escapes <- [[[New@Dictionary[]]Set["n","\n"]]Set["r","\r"]]Set["t","\t"] + token worker <- [[[["String Literal"]Set Input[0, [first]Slice[0]]]Set Input[1, first]]Set Input[2, escapes]]Set Input[3, rest] + //out <- String Literal["", first, rest, simple tokens, token list, escapes] + }{ + second,second rest <- [rest]Slice[1] + If[[[first] = ["<"]] And [[second]=["-"]]] + { + [first]Append[second] + { + token worker <- [["Add Token"]Set Input[0, Token["Assignment", ~, ~]]]Set Input[1, second rest] + } + }{ + + If[[[first] = ["/"]] And [[second] = ["*"]]] + { + token worker <- [[[["Block Comment"]Set Input[0, [first]Slice[0]]]Set Input[1, [first]Append[second]]]Set Input[2, 1]]Set Input[3, second rest] + //out <- Block Comment[next text, simple tokens, token list, 1] + }{ + If[[[first] = ["/"]] And [[second] = ["/"]]] + { + token worker <- [["Line Comment"]Set Input[0, [first]Append[second]]]Set Input[1, second rest] + //out <- Line Comment["", [first]Append[second], next text, simple tokens, token list] + }{ + If[[[first]In["0123456789"]] Or [[[first] = ["-"]] And [[second]In["0123456789"]]]] + { + token worker <- [["Numeric Literal"]Set Input[0, first]]Set Input[1, rest] + //out <- Numeric Literal[text, simple tokens, token list] + }{ + out <- _Lex[rest, [symbol]Append[first], simple tokens, token list] + } + } + } + } + + } + } + Val[token worker] + { + trimmed <- Trim[symbol, " \t\r\n"] + If[[trimmed] = [""]] + { + next list <- Val[token list] + }{ + next list <- [token list]Append[Token["Symbol", trimmed, trimmed]] + } + out <- [[token worker]Do[ + [[()]Append[simple tokens]]Append[next list]] + ]Index[0] + } + }{ + out <- token list + } +} + +Lex[text:out] +{ + simple tokens <- [[[[[[[[[[[New@Dictionary[] + ]Set["{", "Block Begin"] + ]Set["}", "Block End"] + ]Set["(", "List Begin"] + ]Set[")", "List End"] + ]Set["[", "Args Begin"] + ]Set["]", "Args End"] + ]Set[",", "List Separator"] + ]Set[":", "Name Separator"] + ]Set["@", "Method Separator"] + ]Set["`", "Binary Operation"] + ]Set["\n", "Newline"] + out <- _Lex[text, [text]Slice[0], simple tokens, ()] +}