@ -71,41 +71,38 @@
( cons eof token-EOF )
( cons eof token-EOF )
( cons ' TOKEN-TYPE TOKEN-TYPE-CONSTRUCTOR ) ... ) ) )
( cons ' TOKEN-TYPE TOKEN-TYPE-CONSTRUCTOR ) ... ) ) )
( define-syntax ( MAKE-RULE-PARSER rule-id-stx )
( define-syntax ( MAKE-RULE-PARSER stx )
( syntax-case rule-id-stx ( )
( syntax-case stx ( )
[ ( _ start-rule )
[ ( _ START-RULE-ID )
( and ( identifier? #' start-rule )
( and ( identifier? #' START-RULE-ID ) ( member ( syntax-e #' START-RULE-ID ) ' RULE-IDS ) )
( member ( syntax-e #' start-rule ) ' RULE-IDS ) )
;; The cfg-parser depends on the start-rule provided in (start ...) to have the same
;; The cfg-parser depends on the start-rule provided in (start ...) to have the same
;; context as the rest of this body. Hence RECOLORED-START-RULE
;; context as the rest of this body. Hence RECOLORED-START-RULE
( with-syntax ( [ RECOLORED-START-RULE ( datum->syntax #' RULES-STX ( syntax-e #' start-rule ) ) ] )
( with-syntax ( [ RECOLORED-START-RULE ( datum->syntax #' RULES-STX ( syntax-e #' START-RULE-ID ) ) ] )
#' ( let ( [ THE-GRAMMAR ( cfg-parser ( tokens enumerated-tokens )
#' ( let ( )
( define ( rule-parser tokenizer )
( define rule-grammar ( cfg-parser ( tokens enumerated-tokens )
( src-pos )
( src-pos )
( start RECOLORED-START-RULE )
( start RECOLORED-START-RULE )
( end EOF )
( end EOF )
( error THE-ERROR-HANDLER )
( error the-error-handler )
( grammar . GENERATED-RULE-CODES ) ) ] )
( grammar . GENERATED-RULE-CODES ) ) )
( procedure-rename
( define next-token ( make-permissive-tokenizer tokenizer all-tokens-hash/mutable ) )
( case-lambda [ ( tokenizer )
;; here's how we support grammar "cuts" on top rule name
( define next-token
( define parse-tree-stx ( rule-grammar next-token ) )
( make-permissive-tokenizer tokenizer all-tokens-hash/mutable ) )
( syntax-case parse-tree-stx ( )
;; little post-processor to support cuts on top rule name
[ ( TOP-RULE-NAME . _ )
( define parse-tree-stx ( THE-GRAMMAR next-token ) )
( if ( eq? ( syntax-property #' TOP-RULE-NAME ' hide-or-splice? ) ' hide )
( define top-rule-name-stx ( syntax-case parse-tree-stx ( )
( remove-rule-name parse-tree-stx ) ; use `remove-rule-name` so we get the same housekeeping
[ ( TRN . REST ) #' TRN ]
[ _ ( error ' malformed-parse-tree ) ] ) )
( if ( eq? ( syntax-property top-rule-name-stx ' hide-or-splice? ) ' hide )
;; use `remove-rule-name` so we get the same housekeeping
( remove-rule-name parse-tree-stx )
parse-tree-stx ) ]
parse-tree-stx ) ]
[ _ ( error ' malformed-parse-tree ) ] ) )
( case-lambda [ ( tokenizer ) ( rule-parser tokenizer ) ]
[ ( source tokenizer )
[ ( source tokenizer )
( parameterize ( [ current-source source ] )
( parameterize ( [ current-source source ] )
( PARSE tokenizer ) ) ] )
( rule-parser tokenizer ) ) ] ) ) ) ]
( string->symbol ( format " ~a-rule-parser " ' start-rule ) ) ) ) ) ]
[ ( _ not-a-rule-id )
[ ( _ not-a-rule-id )
( raise-syntax-error #f
( raise-syntax-error #f
( format " Rule ~a is not defined in the grammar " ( syntax-e #' not-a-rule-id ) )
( format " Rule ~a is not defined in the grammar " ( syntax-e #' not-a-rule-id ) )
rule-id- stx) ] ) )
stx) ] ) )
;; start-id has to be a value, not an expr, because make-rule-parser is a macro
;; start-id has to be a value, not an expr, because make-rule-parser is a macro
( define PARSE ( procedure-rename ( MAKE-RULE-PARSER START-ID ) ' PARSE ) )
( define PARSE ( procedure-rename ( MAKE-RULE-PARSER START-ID ) ' PARSE ) )