Fix terminal parser with non-default tokenizers
							parent
							
								
									5433553571
								
							
						
					
					
						commit
						6b83ab9d90
					
				| 
						 | 
				
			
			@ -512,3 +512,7 @@ Tok                = Spaces (Number | Special )
 | 
			
		|||
          main= . . . 
 | 
			
		||||
        EBNF] call ast>> 
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ "++" } [
 | 
			
		||||
  "++--" [EBNF tokenizer=("++" | "--") main="++" EBNF] call ast>>
 | 
			
		||||
] unit-test
 | 
			
		||||
| 
						 | 
				
			
			@ -15,13 +15,14 @@ TUPLE: tokenizer any one many ;
 | 
			
		|||
 | 
			
		||||
: default-tokenizer ( -- tokenizer )
 | 
			
		||||
  T{ tokenizer f 
 | 
			
		||||
    [ [ drop t ] satisfy ]
 | 
			
		||||
    [ any-char ]
 | 
			
		||||
    [ token ]
 | 
			
		||||
    [ [ = ] curry satisfy ]
 | 
			
		||||
    [ [ = ] curry any-char swap semantic ]
 | 
			
		||||
  } ;
 | 
			
		||||
 | 
			
		||||
: parser-tokenizer ( parser -- tokenizer )
 | 
			
		||||
  1quotation [ [ = ] curry satisfy ] dup tokenizer boa ;
 | 
			
		||||
  [ 1quotation ] keep
 | 
			
		||||
  [ swap [ = ] curry semantic ] curry dup tokenizer boa ;
 | 
			
		||||
 | 
			
		||||
: rule-tokenizer ( name word -- tokenizer )
 | 
			
		||||
  rule parser-tokenizer ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ IN: peg.javascript
 | 
			
		|||
 | 
			
		||||
: parse-javascript ( string -- ast )
 | 
			
		||||
  tokenize-javascript [
 | 
			
		||||
    ast>> parse-javascript [
 | 
			
		||||
    ast>> javascript [
 | 
			
		||||
      ast>>
 | 
			
		||||
    ] [
 | 
			
		||||
      "Unable to parse JavaScript" throw
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
! Copyright (C) 2008 Chris Double.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
!
 | 
			
		||||
USING: kernel tools.test peg peg.javascript.ast peg.javascript.tokenizer  
 | 
			
		||||
       peg.javascript.parser accessors multiline sequences math ;
 | 
			
		||||
USING: kernel tools.test peg peg.javascript.ast peg.javascript.parser 
 | 
			
		||||
       accessors multiline sequences math ;
 | 
			
		||||
IN: peg.javascript.parser.tests
 | 
			
		||||
 | 
			
		||||
\ parse-javascript must-infer
 | 
			
		||||
\ javascript must-infer
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  T{
 | 
			
		||||
| 
						 | 
				
			
			@ -23,14 +23,14 @@ IN: peg.javascript.parser.tests
 | 
			
		|||
      }
 | 
			
		||||
  }
 | 
			
		||||
} [
 | 
			
		||||
  "123; 'hello'; foo(x);" tokenize-javascript ast>> parse-javascript ast>>
 | 
			
		||||
  "123; 'hello'; foo(x);" javascript ast>>
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ t } [ 
 | 
			
		||||
<"
 | 
			
		||||
var x=5
 | 
			
		||||
var y=10
 | 
			
		||||
"> tokenize-javascript ast>> parse-javascript remaining>> length zero?
 | 
			
		||||
"> javascript remaining>> length zero?
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ function foldl(f, initial, seq) {
 | 
			
		|||
     initial = f(initial, seq[i]);
 | 
			
		||||
   return initial;
 | 
			
		||||
}
 | 
			
		||||
"> tokenize-javascript ast>> parse-javascript remaining>> length zero?
 | 
			
		||||
"> javascript remaining>> length zero?
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
{ t } [ 
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +52,6 @@ ParseState.prototype.from = function(index) {
 | 
			
		|||
    r.length = this.length - index;
 | 
			
		||||
    return r;
 | 
			
		||||
}
 | 
			
		||||
"> tokenize-javascript ast>> parse-javascript remaining>> length zero?
 | 
			
		||||
"> javascript remaining>> length zero?
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,13 @@
 | 
			
		|||
! Copyright (C) 2008 Chris Double.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: kernel accessors peg peg.ebnf peg.javascript.ast ;
 | 
			
		||||
USING: kernel accessors peg peg.ebnf peg.javascript.ast peg.javascript.tokenizer ;
 | 
			
		||||
IN: peg.javascript.parser
 | 
			
		||||
 | 
			
		||||
#! Grammar for JavaScript. Based on OMeta-JS example from:
 | 
			
		||||
#! http://jarrett.cs.ucla.edu/ometa-js/#JavaScript_Compiler 
 | 
			
		||||
 | 
			
		||||
EBNF: parse-javascript
 | 
			
		||||
EBNF: javascript
 | 
			
		||||
tokenizer         = <foreign tokenize-javascript Tok>
 | 
			
		||||
End               = !(.)
 | 
			
		||||
Space             = " " | "\t" | "\n" 
 | 
			
		||||
Spaces            = Space* => [[ ignore ]]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue