Rename ast-number to ast-value (to represent any literal value).
! See http://factorcode.org/license.txt for BSD license.
IN: infix.ast
-TUPLE: ast-number value ;
+TUPLE: ast-value value ;
TUPLE: ast-local name ;
TUPLE: ast-array name index ;
TUPLE: ast-slice name from to step ;
]
]
] unit-test
+
+{ "foobar" } [ [infix append("foo", "bar") infix] ] unit-test
GENERIC: infix-codegen ( ast -- quot/number )
-M: ast-number infix-codegen value>> ;
+M: ast-value infix-codegen value>> ;
M: ast-local infix-codegen
name>> >local-word ;
USING: infix.ast infix.parser infix.tokenizer tools.test ;
IN: infix.parser.tests
-{ T{ ast-number { value 1 } } } [ "1" build-infix-ast ] unit-test
-{ T{ ast-negation f T{ ast-number { value 1 } } } }
+{ T{ ast-value { value 1 } } } [ "1" build-infix-ast ] unit-test
+{ T{ ast-negation f T{ ast-value { value 1 } } } }
[ "-1" build-infix-ast ] unit-test
{ T{ ast-op
{ left
T{ ast-op
- { left T{ ast-number { value 1 } } }
- { right T{ ast-number { value 2 } } }
+ { left T{ ast-value { value 1 } } }
+ { right T{ ast-value { value 2 } } }
{ op "+" }
}
}
- { right T{ ast-number { value 4 } } }
+ { right T{ ast-value { value 4 } } }
{ op "+" }
} } [ "1+2+4" build-infix-ast ] unit-test
{ T{ ast-op
- { left T{ ast-number { value 1 } } }
+ { left T{ ast-value { value 1 } } }
{ right
T{ ast-op
- { left T{ ast-number { value 2 } } }
- { right T{ ast-number { value 3 } } }
+ { left T{ ast-value { value 2 } } }
+ { right T{ ast-value { value 3 } } }
{ op "*" }
}
}
} } [ "1+2*3" build-infix-ast ] unit-test
{ T{ ast-op
- { left T{ ast-number { value 1 } } }
- { right T{ ast-number { value 2 } } }
+ { left T{ ast-value { value 1 } } }
+ { right T{ ast-value { value 2 } } }
{ op "+" }
} } [ "(1+2)" build-infix-ast ] unit-test
{ arguments
V{
T{ ast-op
- { left T{ ast-number { value 1 } } }
- { right T{ ast-number { value 2 } } }
+ { left T{ ast-value { value 1 } } }
+ { right T{ ast-value { value 2 } } }
{ op "+" }
}
T{ ast-op
- { left T{ ast-number { value 2 } } }
- { right T{ ast-number { value 3 } } }
+ { left T{ ast-value { value 2 } } }
+ { right T{ ast-value { value 3 } } }
{ op "%" }
}
}
{ left
T{ ast-op
{ left
- T{ ast-number
+ T{ ast-value
{ value 2 }
}
}
{ right
- T{ ast-number
+ T{ ast-value
{ value 3 }
}
}
}
}
{ right
- T{ ast-number { value 4 } }
+ T{ ast-value { value 4 } }
}
{ op "+" }
}
{ op "+" }
}
}
- { right T{ ast-number { value 2 } } }
+ { right T{ ast-value { value 2 } } }
{ op "/" }
} } [ "(bar() + baz[2/ 3+4 ] )/2" build-infix-ast ] unit-test
{ T{ ast-op
- { left T{ ast-number { value 1 } } }
+ { left T{ ast-value { value 1 } } }
{ right
T{ ast-op
- { left T{ ast-number { value 2 } } }
- { right T{ ast-number { value 3 } } }
+ { left T{ ast-value { value 2 } } }
+ { right T{ ast-value { value 3 } } }
{ op "/" }
}
}
{ name "foo" }
{ arguments
V{
- T{ ast-number { value 2 } }
+ T{ ast-value { value 2 } }
T{ ast-negation
- { term T{ ast-number { value 3 } } }
+ { term T{ ast-value { value 3 } } }
}
}
}
{ name "foo" }
{ arguments
V{
- T{ ast-number
+ T{ ast-value
{ value 2 }
}
}
{ right
T{ ast-negation
{ term
- T{ ast-number
+ T{ ast-value
{ value 1 }
}
}
}
}
}
- { right T{ ast-number { value 3 } } }
+ { right T{ ast-value { value 3 } } }
{ op "/" }
}
}
IN: infix.parser
EBNF: parse-infix
-Number = . ?[ ast-number? ]?
+Number = . ?[ ast-value? ]?
Identifier = . ?[ string? ]?
Array = Identifier:i "[" Sum:s "]" => [[ i s ast-array boa ]]
Slice1 = Identifier:i "[" Sum?:from ":" Sum?:to "]" => [[ i from to f ast-slice boa ]]
USING: infix.ast infix.tokenizer tools.test ;
IN: infix.tokenizer.tests
-{ V{ T{ ast-number f 1 } } } [ "1" tokenize-infix ] unit-test
-{ V{ T{ ast-number f 1.02 } CHAR: * T{ ast-number f 3 } } } [ "1.02*3" tokenize-infix ] unit-test
-{ V{ T{ ast-number f 3 } CHAR: / CHAR: ( T{ ast-number f 3 } CHAR: + T{ ast-number f 4 } CHAR: ) } }
+{ V{ T{ ast-value f 1 } } } [ "1" tokenize-infix ] unit-test
+{ V{ T{ ast-value f 1.02 } CHAR: * T{ ast-value f 3 } } } [ "1.02*3" tokenize-infix ] unit-test
+{ V{ T{ ast-value f 3 } CHAR: / CHAR: ( T{ ast-value f 3 } CHAR: + T{ ast-value f 4 } CHAR: ) } }
[ "3/(3+4)" tokenize-infix ] unit-test
{ V{ "foo" CHAR: ( "x" CHAR: , "y" CHAR: , "z" CHAR: ) } } [ "foo(x,y,z)" tokenize-infix ] unit-test
-{ V{ "arr" CHAR: [ "x" CHAR: + T{ ast-number f 3 } CHAR: ] } }
+{ V{ "arr" CHAR: [ "x" CHAR: + T{ ast-value f 3 } CHAR: ] } }
[ "arr[x+3]" tokenize-infix ] unit-test
[ "1.0.4" tokenize-infix ] must-fail
-{ V{ CHAR: + CHAR: ] T{ ast-number f 3.4 } CHAR: , "bar" } }
+{ V{ CHAR: + CHAR: ] T{ ast-value f 3.4 } CHAR: , "bar" } }
[ "+]3.4,bar" tokenize-infix ] unit-test
{ V{ "baz_34c" } } [ "baz_34c" tokenize-infix ] unit-test
-{ V{ T{ ast-number f 34 } "c_baz" } } [ "34c_baz" tokenize-infix ] unit-test
-{ V{ CHAR: ( T{ ast-number f 1 } CHAR: + T{ ast-number f 2 } CHAR: ) } }
+{ V{ T{ ast-value f 34 } "c_baz" } } [ "34c_baz" tokenize-infix ] unit-test
+{ V{ CHAR: ( T{ ast-value f 1 } CHAR: + T{ ast-value f 2 } CHAR: ) } }
[ "(1+2)" tokenize-infix ] unit-test
-{ V{ T{ ast-number f 1 } CHAR: + T{ ast-number f 2 } CHAR: / T{ ast-number f 3 } } }
+{ V{ T{ ast-value f 1 } CHAR: + T{ ast-value f 2 } CHAR: / T{ ast-value f 3 } } }
[ "1\n+\r2\t/ 3" tokenize-infix ] unit-test
Letter = [a-zA-Z]
Digit = [0-9]
Digits = Digit+
-Number = Digits '.' Digits => [[ "" concat-as string>number ast-number boa ]]
- | Digits => [[ >string string>number ast-number boa ]]
+Number = Digits '.' Digits => [[ "" concat-as string>number ast-value boa ]]
+ | Digits => [[ >string string>number ast-value boa ]]
+String = '"' [^"]* '"' => [[ second >string ast-value boa ]]
Space = [ \t\n\r]
Spaces = Space* => [[ ignore ]]
NameFirst = Letter | "_" => [[ CHAR: _ ]]
Special = [+*/%(),] | "-" => [[ CHAR: - ]]
| "[" => [[ CHAR: [ ]] | "]" => [[ CHAR: ] ]]
| ":" => [[ CHAR: : ]]
-Tok = Spaces (Name | Number | Special )
+Tok = Spaces (Name | Number | String | Special )
End = !(.)
Toks = Tok* Spaces End
;EBNF