Jump to content

  • Log In with Google      Sign In   
  • Create Account


#ActualCornstalks

Posted 27 February 2013 - 10:21 AM

Here's a little sample from my Racket-based parser for parsing tokenized Python (uses Matt Might's derivative parser):
 

; <program> ::= (program <stmt>*)
(file_input      (@--> (seq! `(rep (or NEWLINE stmt)) ENDMARKER)
                       (λ (seq) `(program ,@seq))))
 
; <funcdef> ::= (def (<NAME> <NAME>*) <suite>)
(funcdef         ($--> (seq! "def" `NAME `parameters ":" `suite)
                       `(def (,($ 0) ,@($ 1)) ,($ 2))))
 
; ... more stuff

; <simple_stmt> ::= <small_stmt> | (begin <small_stmt>+)
(simple_stmt     (>--> (seq! `(seq* small_stmt
                                    (rep (seq! ";" `small_stmt)))
                             (opt ";")
                             NEWLINE)
                       [`((,small_stmt ())) small_stmt]
                       [`((,small_stmt ,rep)) `(begin ,small_stmt ,@rep)]))
 
; ... and a ton more cryptic cases

 
Because you can never have enough randomly* placed symbols sprinkled throughout your code...
*and by randomly, I mean very carefully

A whole file of this is actually kinda mesmerizing when you look back on what you've written.


#1Cornstalks

Posted 27 February 2013 - 10:18 AM

Here's a little sample from my Racket-based parser for parsing tokenized Python (uses Matt Might's derivative parser):

 

; <program> ::= (program <stmt>*)
(file_input      (@--> (seq! `(rep (or NEWLINE stmt)) ENDMARKER)
                       (λ (seq) `(program ,@seq))))
 
; <funcdef> ::= (def (<NAME> <NAME>*) <suite>)
(funcdef         ($--> (seq! "def" `NAME `parameters ":" `suite)
                       `(def (,($ 0) ,@($ 1)) ,($ 2))))
 
; ... more stuff

 
; <simple_stmt> ::= <small_stmt> | (begin <small_stmt>+)
(simple_stmt     (>--> (seq! `(seq* small_stmt
                                    (rep (seq! ";" `small_stmt)))
                             (opt ";")
                             NEWLINE)
                       [`((,small_stmt ())) small_stmt]
                       [`((,small_stmt ,rep)) `(begin ,small_stmt ,@rep)]))
 
; ... and a ton more cryptic cases

 
Because you can never have enough randomly* placed symbols sprinkled throughout your code...
*and by random, I mean very carefully

PARTNERS