Added while and switch.

This commit is contained in:
Marvin Blum
2015-09-21 17:16:00 +02:00
parent af7a0a9f4c
commit 1f0730b984
7 changed files with 103 additions and 10 deletions

View File

@@ -21,6 +21,10 @@ func parseBlock() {
parseVar()
} else if accept("if") {
parseIf()
} else if accept("while") {
parseWhile()
} else if accept("switch") {
parseSwitch()
} else if accept("func") {
parseFunction()
} else {
@@ -63,6 +67,60 @@ func parseIf() {
appendOut("};\n")
}
func parseWhile() {
expect("while")
appendOut("while {")
parseExpression()
appendOut("} do {\n")
expect("{")
parseBlock()
expect("}")
appendOut("};\n")
}
func parseSwitch() {
expect("switch")
appendOut("switch (")
parseExpression()
appendOut(") do {\n")
expect("{")
parseSwitchBlock()
expect("}")
appendOut("};\n")
}
func parseSwitchBlock() {
if accept("}") {
return
}
if accept("case") {
expect("case")
appendOut("case ")
parseExpression()
expect(":")
appendOut(":\n")
if !accept("case") && !accept("}") {
appendOut("{\n")
parseBlock()
appendOut("};\n")
}
} else if accept("default") {
expect("default")
expect(":")
appendOut("default:\n")
if !accept("}") {
appendOut("{\n")
parseBlock()
appendOut("};\n")
}
}
parseSwitchBlock()
}
func parseFunction() {
expect("func")
appendOut(get().token+" = {\n")
@@ -99,7 +157,7 @@ func parseFunctionParameter() {
// Everything that does not start with a keyword.
func parseStatement() {
// empty block
if accept("}") {
if accept("}") || accept("case") || accept("default") {
return
}
@@ -151,7 +209,7 @@ func parseParameter() {
func parseExpression() {
openingBrackets := 0
for !accept(",") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) {
for !accept(",") && !accept(":") && !accept(";") && !accept("{") && !accept("}") && (openingBrackets != 0 || !accept(")")) {
current := get().token
appendOut(current)

View File

@@ -2,6 +2,7 @@ package asl
import (
"fmt"
"strings"
)
type Token struct{
@@ -18,14 +19,19 @@ var delimiter = []byte{'=',
'>',
'!',
',',
':',
'&',
'|'}
var keywords = []string{"var",
"if",
"while",
"switch",
"func",
"true",
"false"}
"false",
"case",
"default"}
var whitespace = []byte{' ', '\n', '\t'}
@@ -43,7 +49,7 @@ func Tokenize(code []byte) []Token {
tokens = append(tokens, Token{string(c)})
token = ""
} else if stringArrayContains(keywords, token) {
} else if stringArrayContains(keywords, strings.ToLower(token)) {
tokens = append(tokens, Token{token})
token = ""
} else if !byteArrayContains(whitespace, c) {

View File

@@ -8,7 +8,7 @@ import (
func main(){
// read test file
code, _ := ioutil.ReadFile("in/simple.asl")
code, _ := ioutil.ReadFile("in/statements.asl")
token := asl.Tokenize(code)
out := asl.Parse(token)