]> gitweb.factorcode.org Git - factor.git/commitdiff
infix: add support for string literals.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 16 Mar 2017 23:14:51 +0000 (16:14 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 16 Mar 2017 23:14:51 +0000 (16:14 -0700)
Rename ast-number to ast-value (to represent any literal value).

extra/infix/ast/ast.factor
extra/infix/infix-tests.factor
extra/infix/infix.factor
extra/infix/parser/parser-tests.factor
extra/infix/parser/parser.factor
extra/infix/tokenizer/tokenizer-tests.factor
extra/infix/tokenizer/tokenizer.factor

index 465fec6569ea71777c7de72a0b8c25fbd11ddde3..bff4df60c3e8fd130ee12979ceb303524cbfc047 100644 (file)
@@ -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 ;
index 3368b74e0fcb7c75b6e013d3e3960e6ace6b40b7..ec3fd7c1cf8593cacd787c2ceb24f36c1a463e0e 100644 (file)
@@ -62,3 +62,5 @@ INFIX:: foo ( x y -- z ) x**2-abs(y) ;
         ]
     ]
 ] unit-test
+
+{ "foobar" } [ [infix append("foo", "bar") infix] ] unit-test
index 2aafd3bf73cd1486e4e227ce8523b0f184412f17..75395a2608ec392bc6b10c510aced64df71d9f59 100644 (file)
@@ -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 ;
index 24bb3acad99cd4c21746816eba3cc5ae587c7048..7819b2d5679ed1c5bdd7e90c44a51f51a0f321fc 100644 (file)
@@ -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 "/" }
         }
     }
index 5b02dd05c257542aaed9257de40f8c5e632c7597..e637d58fd03ebd97ec4e8c4d403a53f4711d4dee 100644 (file)
@@ -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 ]]
index b5392f52918d754be6365373ead063853cd0947c..4a5abff3016bc97eeb66646ffaf2665548455a53 100644 (file)
@@ -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
index 71e4675cc8aff8f17e52460c35475cbb4e577445..baff0440560bca5a2e882563d835c83885351e30 100644 (file)
@@ -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