diff --git a/extra/infix/ast/ast.factor b/extra/infix/ast/ast.factor index 465fec6569..bff4df60c3 100644 --- a/extra/infix/ast/ast.factor +++ b/extra/infix/ast/ast.factor @@ -2,7 +2,7 @@ ! 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 ; diff --git a/extra/infix/infix-tests.factor b/extra/infix/infix-tests.factor index 3368b74e0f..ec3fd7c1cf 100644 --- a/extra/infix/infix-tests.factor +++ b/extra/infix/infix-tests.factor @@ -62,3 +62,5 @@ INFIX:: foo ( x y -- z ) x**2-abs(y) ; ] ] ] unit-test + +{ "foobar" } [ [infix append("foo", "bar") infix] ] unit-test diff --git a/extra/infix/infix.factor b/extra/infix/infix.factor index 2aafd3bf73..75395a2608 100644 --- a/extra/infix/infix.factor +++ b/extra/infix/infix.factor @@ -33,7 +33,7 @@ ERROR: invalid-op string ; 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 ; diff --git a/extra/infix/parser/parser-tests.factor b/extra/infix/parser/parser-tests.factor index 24bb3acad9..7819b2d567 100644 --- a/extra/infix/parser/parser-tests.factor +++ b/extra/infix/parser/parser-tests.factor @@ -3,27 +3,27 @@ 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 "*" } } } @@ -31,8 +31,8 @@ IN: infix.parser.tests } } [ "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 @@ -44,13 +44,13 @@ IN: infix.parser.tests { 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 "%" } } } @@ -74,12 +74,12 @@ IN: infix.parser.tests { left T{ ast-op { left - T{ ast-number + T{ ast-value { value 2 } } } { right - T{ ast-number + T{ ast-value { value 3 } } } @@ -87,7 +87,7 @@ IN: infix.parser.tests } } { right - T{ ast-number { value 4 } } + T{ ast-value { value 4 } } } { op "+" } } @@ -97,16 +97,16 @@ IN: infix.parser.tests { 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 "/" } } } @@ -119,9 +119,9 @@ IN: infix.parser.tests { 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 } } } } } } @@ -142,7 +142,7 @@ IN: infix.parser.tests { name "foo" } { arguments V{ - T{ ast-number + T{ ast-value { value 2 } } } @@ -152,7 +152,7 @@ IN: infix.parser.tests { right T{ ast-negation { term - T{ ast-number + T{ ast-value { value 1 } } } @@ -163,7 +163,7 @@ IN: infix.parser.tests } } } - { right T{ ast-number { value 3 } } } + { right T{ ast-value { value 3 } } } { op "/" } } } diff --git a/extra/infix/parser/parser.factor b/extra/infix/parser/parser.factor index 5b02dd05c2..e637d58fd0 100644 --- a/extra/infix/parser/parser.factor +++ b/extra/infix/parser/parser.factor @@ -5,7 +5,7 @@ strings vectors ; 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 ]] diff --git a/extra/infix/tokenizer/tokenizer-tests.factor b/extra/infix/tokenizer/tokenizer-tests.factor index b5392f5291..4a5abff301 100644 --- a/extra/infix/tokenizer/tokenizer-tests.factor +++ b/extra/infix/tokenizer/tokenizer-tests.factor @@ -3,19 +3,19 @@ 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 diff --git a/extra/infix/tokenizer/tokenizer.factor b/extra/infix/tokenizer/tokenizer.factor index 71e4675cc8..baff044056 100644 --- a/extra/infix/tokenizer/tokenizer.factor +++ b/extra/infix/tokenizer/tokenizer.factor @@ -8,8 +8,9 @@ EBNF: tokenize-infix 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: _ ]] @@ -18,7 +19,7 @@ Name = NameFirst NameRest* => [[ first2 swap prefix >string ]] Special = [+*/%(),] | "-" => [[ CHAR: - ]] | "[" => [[ CHAR: [ ]] | "]" => [[ CHAR: ] ]] | ":" => [[ CHAR: : ]] -Tok = Spaces (Name | Number | Special ) +Tok = Spaces (Name | Number | String | Special ) End = !(.) Toks = Tok* Spaces End ;EBNF