From a5719e33976ae6ebfc75ab81edd6d56dd0f0ee0a Mon Sep 17 00:00:00 2001 From: Chris Double Date: Wed, 18 Jun 2008 21:30:21 +1200 Subject: [PATCH] Add javascript tests. Minor changes to javascript grammar --- extra/peg/javascript/javascript-tests.factor | 42 ++++++++++++++++++++ extra/peg/javascript/javascript.factor | 16 ++++---- 2 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 extra/peg/javascript/javascript-tests.factor diff --git a/extra/peg/javascript/javascript-tests.factor b/extra/peg/javascript/javascript-tests.factor new file mode 100644 index 0000000000..70410a3838 --- /dev/null +++ b/extra/peg/javascript/javascript-tests.factor @@ -0,0 +1,42 @@ +! Copyright (C) 2008 Chris Double. +! See http://factorcode.org/license.txt for BSD license. +! +USING: kernel tools.test peg peg.javascript accessors ; +IN: peg.javascript.tests + +\ javascript must-infer + +{ + V{ + T{ ast-number f 123 } + ";" + T{ ast-string f "hello" } + ";" + T{ ast-name f "foo" } + "(" + T{ ast-name f "x" } + ")" + ";" + } +} [ + "123; 'hello'; foo(x);" tokenizer ast>> +] unit-test + +{ + T{ + ast-begin + f + V{ + T{ ast-number f 123 } + T{ ast-string f "hello" } + T{ + ast-call + f + T{ ast-get f "foo" } + V{ T{ ast-get f "x" } } + } + } + } +} [ + "123; 'hello'; foo(x);" tokenizer ast>> javascript ast>> +] unit-test \ No newline at end of file diff --git a/extra/peg/javascript/javascript.factor b/extra/peg/javascript/javascript.factor index bdf5f4b369..030d2f1728 100644 --- a/extra/peg/javascript/javascript.factor +++ b/extra/peg/javascript/javascript.factor @@ -1,4 +1,4 @@ -! Copyright (C) 2007 Chris Double. +! Copyright (C) 2008 Chris Double. ! See http://factorcode.org/license.txt for BSD license. USING: kernel arrays strings math.parser sequences sequences.deep peg peg.ebnf peg.parsers memoize namespaces math accessors ; @@ -49,14 +49,14 @@ TUPLE: ast-default cs ; EBNF: tokenizer Letter = [a-zA-Z] Digit = [0-9] -Digits = (Digit)+ +Digits = Digit+ SingleLineComment = "//" (!("\n") .)* "\n" => [[ ignore ]] MultiLineComment = "/*" (!("*/") .)* "*/" => [[ ignore ]] Space = " " | "\t" | "\n" | SingleLineComment | MultiLineComment -Spaces = (Space)* => [[ ignore ]] +Spaces = Space* => [[ ignore ]] NameFirst = Letter | "$" | "_" NameRest = NameFirst | Digit -iName = NameFirst (NameRest)* => [[ first2 swap prefix >string ]] +iName = NameFirst NameRest* => [[ first2 swap prefix >string ]] Keyword = ("break" | "case" | "catch" @@ -101,12 +101,12 @@ Special = "(" | ")" | "{" | "}" | "[" | "]" | "," | " | "-" | "*=" | "*" | "/=" | "/" | "%=" | "%" | "&&=" | "&&" | "||=" | "||" | "." | "!" Tok = Spaces (Name | Keyword | Number | Str | Special ) -Toks = (Tok)* Spaces +Toks = Tok* Spaces ;EBNF EBNF: javascript Space = " " | "\t" | "\n" -Spaces = (Space)* => [[ ignore ]] +Spaces = Space* => [[ ignore ]] Name = . ?[ ast-name? ]? => [[ value>> ]] Number = . ?[ ast-number? ]? => [[ value>> ]] String = . ?[ ast-string? ]? => [[ value>> ]] @@ -192,7 +192,7 @@ ForIn1 = "var" Name:n => [[ n "undefined" ast-get boa ast-var boa | Expr Switch1 = "case" Expr:c ":" SrcElems:cs => [[ c cs ast-case boa ]] | "default" ":" SrcElems:cs => [[ cs ast-default boa ]] -SwitchBody = (Switch1)* +SwitchBody = Switch1* Finally = "finally" Block:b => [[ b ]] | Spaces => [[ "undefined" ast-get boa ]] Stmt = Block @@ -214,6 +214,6 @@ Stmt = Block | ";" => [[ "undefined" ast-get boa ]] SrcElem = "function" Name:n FuncRest:f => [[ n f ast-var boa ]] | Stmt -SrcElems = (SrcElem)* => [[ ast-begin boa ]] +SrcElems = SrcElem* => [[ ast-begin boa ]] TopLevel = SrcElems Spaces ;EBNF \ No newline at end of file