Build in functions.

This commit is contained in:
Marvin Blum
2015-09-21 20:26:49 +02:00
parent b489e5018c
commit 5a91193cae
11 changed files with 94 additions and 95 deletions

View File

@@ -31,9 +31,15 @@ func parseBlock() {
parseForeach()
} else if accept("func") {
parseFunction()
} else if accept("return") {
parseReturn()
} else {
parseStatement()
}
if !end() && !accept("}") {
parseBlock()
}
}
func parseVar() {
@@ -192,6 +198,14 @@ func parseFunctionParameter() {
}
}
func parseReturn() {
expect("return")
appendOut("return ")
parseExpression(true)
expect(";")
appendOut(";\n")
}
// Everything that does not start with a keyword.
func parseStatement() {
// empty block
@@ -206,13 +220,17 @@ func parseStatement() {
if accept("=") {
appendOut(name)
parseAssignment()
} else if name == "$" {
name = get().token
next()
parseBuildinFunctionCall(name);
} else {
parseFunctionCall()
appendOut(name+";\n")
}
if !end() {
parseStatement()
parseBlock()
}
}
@@ -233,6 +251,20 @@ func parseFunctionCall() {
appendOut("] call ")
}
func parseBuildinFunctionCall(name string) {
expect("(")
appendOut("[")
parseParameter()
expect(")")
appendOut("] ")
expect("(")
appendOut(name+" [")
parseParameter()
expect(")")
expect(";")
appendOut("];\n")
}
func parseParameter() {
for !accept(")") {
parseExpression(true)

View File

@@ -21,7 +21,8 @@ var delimiter = []byte{
',',
':',
'&',
'|'}
'|',
'$'}
var keywords = []string{
"var",
@@ -34,7 +35,8 @@ var keywords = []string{
"true",
"false",
"case",
"default"}
"default",
"return"}
var whitespace = []byte{' ', '\n', '\t'}

View File

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