Add javascript tests. Minor changes to javascript grammar

db4
Chris Double 2008-06-18 21:30:21 +12:00
parent 778573106c
commit a5719e3397
2 changed files with 50 additions and 8 deletions

View File

@ -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

View File

@ -1,4 +1,4 @@
! Copyright (C) 2007 Chris Double. ! Copyright (C) 2008 Chris Double.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel arrays strings math.parser sequences sequences.deep USING: kernel arrays strings math.parser sequences sequences.deep
peg peg.ebnf peg.parsers memoize namespaces math accessors ; peg peg.ebnf peg.parsers memoize namespaces math accessors ;
@ -49,14 +49,14 @@ TUPLE: ast-default cs ;
EBNF: tokenizer EBNF: tokenizer
Letter = [a-zA-Z] Letter = [a-zA-Z]
Digit = [0-9] Digit = [0-9]
Digits = (Digit)+ Digits = Digit+
SingleLineComment = "//" (!("\n") .)* "\n" => [[ ignore ]] SingleLineComment = "//" (!("\n") .)* "\n" => [[ ignore ]]
MultiLineComment = "/*" (!("*/") .)* "*/" => [[ ignore ]] MultiLineComment = "/*" (!("*/") .)* "*/" => [[ ignore ]]
Space = " " | "\t" | "\n" | SingleLineComment | MultiLineComment Space = " " | "\t" | "\n" | SingleLineComment | MultiLineComment
Spaces = (Space)* => [[ ignore ]] Spaces = Space* => [[ ignore ]]
NameFirst = Letter | "$" | "_" NameFirst = Letter | "$" | "_"
NameRest = NameFirst | Digit NameRest = NameFirst | Digit
iName = NameFirst (NameRest)* => [[ first2 swap prefix >string ]] iName = NameFirst NameRest* => [[ first2 swap prefix >string ]]
Keyword = ("break" Keyword = ("break"
| "case" | "case"
| "catch" | "catch"
@ -101,12 +101,12 @@ Special = "(" | ")" | "{" | "}" | "[" | "]" | "," | "
| "-" | "*=" | "*" | "/=" | "/" | "%=" | "%" | "&&=" | "-" | "*=" | "*" | "/=" | "/" | "%=" | "%" | "&&="
| "&&" | "||=" | "||" | "." | "!" | "&&" | "||=" | "||" | "." | "!"
Tok = Spaces (Name | Keyword | Number | Str | Special ) Tok = Spaces (Name | Keyword | Number | Str | Special )
Toks = (Tok)* Spaces Toks = Tok* Spaces
;EBNF ;EBNF
EBNF: javascript EBNF: javascript
Space = " " | "\t" | "\n" Space = " " | "\t" | "\n"
Spaces = (Space)* => [[ ignore ]] Spaces = Space* => [[ ignore ]]
Name = . ?[ ast-name? ]? => [[ value>> ]] Name = . ?[ ast-name? ]? => [[ value>> ]]
Number = . ?[ ast-number? ]? => [[ value>> ]] Number = . ?[ ast-number? ]? => [[ value>> ]]
String = . ?[ ast-string? ]? => [[ value>> ]] String = . ?[ ast-string? ]? => [[ value>> ]]
@ -192,7 +192,7 @@ ForIn1 = "var" Name:n => [[ n "undefined" ast-get boa ast-var boa
| Expr | Expr
Switch1 = "case" Expr:c ":" SrcElems:cs => [[ c cs ast-case boa ]] Switch1 = "case" Expr:c ":" SrcElems:cs => [[ c cs ast-case boa ]]
| "default" ":" SrcElems:cs => [[ cs ast-default boa ]] | "default" ":" SrcElems:cs => [[ cs ast-default boa ]]
SwitchBody = (Switch1)* SwitchBody = Switch1*
Finally = "finally" Block:b => [[ b ]] Finally = "finally" Block:b => [[ b ]]
| Spaces => [[ "undefined" ast-get boa ]] | Spaces => [[ "undefined" ast-get boa ]]
Stmt = Block Stmt = Block
@ -214,6 +214,6 @@ Stmt = Block
| ";" => [[ "undefined" ast-get boa ]] | ";" => [[ "undefined" ast-get boa ]]
SrcElem = "function" Name:n FuncRest:f => [[ n f ast-var boa ]] SrcElem = "function" Name:n FuncRest:f => [[ n f ast-var boa ]]
| Stmt | Stmt
SrcElems = (SrcElem)* => [[ ast-begin boa ]] SrcElems = SrcElem* => [[ ast-begin boa ]]
TopLevel = SrcElems Spaces TopLevel = SrcElems Spaces
;EBNF ;EBNF