Documentation
¶
Overview ¶
Package parser generates an Abstract Syntax Tree (AST) from a sequence of tokens, generated by lexer.
CONTEXT FREE GRAMMAR ¶
Goal = Expr | Func | Var
Func = "def" Identifier "(" [ Params ] ")" Expr Identifier = Letter { ( Letter | Digit ) } Letter = "a" .. "z" | "A" .. "Z" Digit = "0" .. "9" Params = Identifier { "," Identifier }
Var = Identifier "=" Expr
Expr = Operand | BinExpr
Operand = Number | Identifier | Group | Call Number = Digit [ "." { Digit } ] | "." Digit Group = "(" Expr ")" Call = Ident "(" [ Args ] ")" Args = Expr { "," Expr }
BinExpr = Expr Op Expr Op = AddOp | MulOp AddOp = "+" | "-" MulOp = "*" | "/"
EXAMPLE
var n = 5 # comment def fib(x) if x < 3 then 1 else fib(x-1)+fib(x-2) fib(10)
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrParse = errors.New("parse error")
ErrParse means there is an error in parsing.
Functions ¶
func ParseExpr ¶
ParseExpr parses a single expression. A declaration is a valid expression.
Example ¶
package main
import (
"fmt"
"github.com/skhal/lab/x/kscope/internal/parser"
)
func main() {
const s = `
var a = 1
var b = a + 22
def c()
a + b * 2
def d(x, y)
x * c() + a
`
n, err := parser.Parse(s)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(n)
}
Output: var a = 1.0 var b = a + 22.0 def c() a + b * 2.0 def d(x, y) x * c() + a
Types ¶
This section is empty.