implement expr.Macro
This commit is contained in:
parent
9f53060b0c
commit
b53da9531c
28
expr/expr.go
28
expr/expr.go
@ -90,6 +90,27 @@ func (id Identifier) Equal(e Actual) bool {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Macro is an identifier for a macro which can be used to transform
|
||||||
|
// expressions. The tokens for macros start with a '%', but the Macro identifier
|
||||||
|
// itself has that stripped off
|
||||||
|
type Macro string
|
||||||
|
|
||||||
|
// String returns the Macro with a '%' prepended to it
|
||||||
|
func (m Macro) String() string {
|
||||||
|
return "%" + string(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal implements the Actual method
|
||||||
|
func (m Macro) Equal(e Actual) bool {
|
||||||
|
mm, ok := e.(Macro)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return m == mm
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Tuple represents a fixed set of expressions which are interacted with as if
|
// Tuple represents a fixed set of expressions which are interacted with as if
|
||||||
// they were a single value
|
// they were a single value
|
||||||
type Tuple []Expr
|
type Tuple []Expr
|
||||||
@ -391,12 +412,15 @@ func parseIdentifier(t lexer.Token) (Expr, error) {
|
|||||||
}
|
}
|
||||||
e.Actual = Int(n)
|
e.Actual = Int(n)
|
||||||
|
|
||||||
} else if t.Val == "true" {
|
} else if t.Val == "%true" {
|
||||||
e.Actual = Bool(true)
|
e.Actual = Bool(true)
|
||||||
|
|
||||||
} else if t.Val == "false" {
|
} else if t.Val == "%false" {
|
||||||
e.Actual = Bool(false)
|
e.Actual = Bool(false)
|
||||||
|
|
||||||
|
} else if t.Val[0] == '%' {
|
||||||
|
e.Actual = Macro(t.Val[1:])
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
e.Actual = Identifier(t.Val)
|
e.Actual = Identifier(t.Val)
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,9 @@ func assertParse(t *T, in []lexer.Token, expExpr Expr, expOut []lexer.Token) {
|
|||||||
|
|
||||||
func TestParseSingle(t *T) {
|
func TestParseSingle(t *T) {
|
||||||
foo := lexer.Token{TokenType: lexer.Identifier, Val: "foo"}
|
foo := lexer.Token{TokenType: lexer.Identifier, Val: "foo"}
|
||||||
|
fooM := lexer.Token{TokenType: lexer.Identifier, Val: "%foo"}
|
||||||
fooExpr := Expr{Actual: Identifier("foo")}
|
fooExpr := Expr{Actual: Identifier("foo")}
|
||||||
|
fooMExpr := Expr{Actual: Macro("foo")}
|
||||||
|
|
||||||
toks := []lexer.Token{foo}
|
toks := []lexer.Token{foo}
|
||||||
assertParse(t, toks, fooExpr, []lexer.Token{})
|
assertParse(t, toks, fooExpr, []lexer.Token{})
|
||||||
@ -56,6 +58,9 @@ func TestParseSingle(t *T) {
|
|||||||
|
|
||||||
toks = []lexer.Token{openParen, openParen, foo, closeParen, closeParen, foo}
|
toks = []lexer.Token{openParen, openParen, foo, closeParen, closeParen, foo}
|
||||||
assertParse(t, toks, fooExpr, []lexer.Token{foo})
|
assertParse(t, toks, fooExpr, []lexer.Token{foo})
|
||||||
|
|
||||||
|
toks = []lexer.Token{fooM, foo}
|
||||||
|
assertParse(t, toks, fooMExpr, []lexer.Token{foo})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseTuple(t *T) {
|
func TestParseTuple(t *T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user