diff options
-rw-r--r-- | src/tparse/preproc.go | 1 | ||||
-rw-r--r-- | src/tparse/tokenize.go | 34 | ||||
-rw-r--r-- | src/tparse/tree.go | 32 | ||||
-rw-r--r-- | src/tparse/type.go | 16 | ||||
-rw-r--r-- | tests/block-test.tnsl | 29 | ||||
-rw-r--r-- | tests/comment-test.tnsl | 16 | ||||
-rw-r--r-- | tests/literal-test.tnsl | 4 | ||||
-rw-r--r-- | tests/parameter-test.tnsl | 2 | ||||
-rwxr-xr-x | tests/run-tests.sh | 3 |
9 files changed, 101 insertions, 36 deletions
diff --git a/src/tparse/preproc.go b/src/tparse/preproc.go new file mode 100644 index 0000000..f591b44 --- /dev/null +++ b/src/tparse/preproc.go @@ -0,0 +1 @@ +package tparse diff --git a/src/tparse/tokenize.go b/src/tparse/tokenize.go index 79a0605..f5e3f54 100644 --- a/src/tparse/tokenize.go +++ b/src/tparse/tokenize.go @@ -126,12 +126,32 @@ func stripBlockComments(t []Token) []Token { out := []Token{} bc := false for _, tok := range t { - if tok.Type == DELIMIT && tok.Data == "/#" { - bc = true - continue - } else if tok.Type == DELIMIT && tok.Data == "#/" { - bc = false - continue + + if tok.Type == DELIMIT { + switch tok.Data { + case ";#": + out = append(out, Token{DELIMIT, ";/", tok.Line, tok.Char}) + bc = true + continue + case ":#": + out = append(out, Token{DELIMIT, ":/", tok.Line, tok.Char}) + bc = true + continue + case "/#": + bc = true + continue + case "#;": + out = append(out, Token{DELIMIT, "/;", tok.Line, tok.Char}) + bc = false + continue + case "#:": + out = append(out, Token{DELIMIT, "/:", tok.Line, tok.Char}) + bc = false + continue + case "#/": + bc = false + continue + } } else if bc { continue } @@ -158,7 +178,7 @@ func TokenizeFile(path string) []Token { max := maxResRunes() - ln, cn, last := int(0), int(-1), int(0) + ln, cn, last := int(1), int(-1), int(0) sp := false for r := rune(' '); ; r, _, err = read.ReadRune() { diff --git a/src/tparse/tree.go b/src/tparse/tree.go index 48c198c..417580a 100644 --- a/src/tparse/tree.go +++ b/src/tparse/tree.go @@ -27,6 +27,38 @@ func handleCode(tokens *[]Token, start int) (Node, int) { return out, start } +func handleBlock(tokens *[]Token, start int) (Node, int) { + var out Node + var tmp Node + + l := len(*tokens) + + if start >= l { + panic((*tokens)[l-1]) + } + + for ; start < l; start++ { + t := (*tokens)[start] + switch t.Type { + case LINESEP: + if t.Data == ";" { + tmp, start = handleCode(tokens, start+1) + } + break + case DELIMIT: + if t.Data == "/;" { + tmp, start = handleCode(tokens, start+1) + } + break + default: + panic(t) + } + out.SubNodes = append(out.SubNodes, tmp) + } + + return out, start +} + func handlePre(tokens *[]Token, start int) (Node, int) { out := Node{} diff --git a/src/tparse/type.go b/src/tparse/type.go index 735f681..3e6ef50 100644 --- a/src/tparse/type.go +++ b/src/tparse/type.go @@ -34,14 +34,11 @@ var RESWORD = map[string]int{ "import": PREWORD, "bool": KEYTYPE, - "byte": KEYTYPE, "char": KEYTYPE, "int": KEYTYPE, "float": KEYTYPE, - "string": KEYTYPE, - "struct": KEYWORD, "type": KEYWORD, @@ -94,12 +91,12 @@ var RESRUNE = map[rune]int{ // Start of pre-proc directive ':': LINESEP, - // Start of line + // Statement seperator ';': LINESEP, // Comment line '#': LINESEP, - // Seperate arguments + // Seperate arguments or enclosed statements ',': ARGNSEP, // Assignment @@ -156,8 +153,17 @@ var RESRUNES = map[string]int{ // Comment block "/#": DELIMIT, "#/": DELIMIT, + // Preproc block + "/:": DELIMIT, + ":/": DELIMIT, + // Redef blocks ";;": DELIMIT, + "::": DELIMIT, + ";#": DELIMIT, + ":#": DELIMIT, + "#;": DELIMIT, + "#:": DELIMIT, // Boolean equ "==": AUGMENT, diff --git a/tests/block-test.tnsl b/tests/block-test.tnsl index a05ca60..e5c3aaf 100644 --- a/tests/block-test.tnsl +++ b/tests/block-test.tnsl @@ -1,33 +1,26 @@ -;int i = 0 - /;if (i==0) ;i = 2 - ;/ -/;else - ;i = 0 -;/ +/: import + "this" + "that" +:/ # ;; can be used as a quick block re-definition /;if (i==0) ;i = 2 - ;;else ;i = 0 - ;/ -/;if - ;char ch = '\n' - -;;else - ;int it = 90 - -;/ +# Comment block switching -/;main - ; - +/; if (i == 2) + ;i = 4 +;# + Comment +#; else + ;i = 6 ;/
\ No newline at end of file diff --git a/tests/comment-test.tnsl b/tests/comment-test.tnsl index fe07b45..cdd33be 100644 --- a/tests/comment-test.tnsl +++ b/tests/comment-test.tnsl @@ -11,12 +11,20 @@ a/# Ok, so this should give no output either #/ -#; +# ; #a # /; -;# +; # stuff a# /;# -#;/ -;/
\ No newline at end of file +# ;/ +;/ + +# More intricate block changing checks + +/# Comment start +Comment end #; if (thing) +;; else if (other_thing) +;# Comment start +End #/
\ No newline at end of file diff --git a/tests/literal-test.tnsl b/tests/literal-test.tnsl index b447e57..e3b73da 100644 --- a/tests/literal-test.tnsl +++ b/tests/literal-test.tnsl @@ -1,6 +1,6 @@ # These should all work -;string s = "\"" -;string st="\\" +;[]char s = "\"" +;[]char st="\\" ;int i = 0 ;int j=1 diff --git a/tests/parameter-test.tnsl b/tests/parameter-test.tnsl new file mode 100644 index 0000000..c969427 --- /dev/null +++ b/tests/parameter-test.tnsl @@ -0,0 +1,2 @@ +/; loop (int initial = 0, int complex = 2) [initial < max || complex < 40, initial++, complex += 7, another += 2] +;/ diff --git a/tests/run-tests.sh b/tests/run-tests.sh index 0bc57b0..6f49335 100755 --- a/tests/run-tests.sh +++ b/tests/run-tests.sh @@ -12,4 +12,7 @@ PARSEFILE=comment parse PARSEFILE=literal +parse + +PARSEFILE=parameter parse
\ No newline at end of file |