I'm trying to use the brag AST generator as taught in the book Beautiful Racket build a parser from the following grammar (in grammar.rkt:
#lang brag
select : /"select" fields /"from" source joins* filters*
fields : @field (/"," @field)*
field : WORD
source : WORD
joins : join*
join : "join" source "on" "(" condition ")"
filters : "where" condition ("and" | "or" condition)*
condition : field | INTEGER "=" field | INTEGER
Here is my reader and tokenizer, in a file called reader.rkt:
#lang br/quicklang
(require "grammar.rkt")
(define (read-syntax path port)
(define parse-tree (parse path (make-tokenizer port)))
(define module-datum `(module sql-mod "expander.rkt"
,parse-tree))
(datum->syntax #f module-datum))
(provide read-syntax)
; tokenizer
(require brag/support)
(define (make-tokenizer port)
(define (next-token)
(define bf-lexer
(lexer
["select" lexeme]
[whitespace (token lexeme #:skip? #t)]
[any-char (next-token)]))
(bf-lexer port))
next-token)
Right now I'm just trying to get it to parse the select, but as we'll see in the error below, even that fails.
My expander should just be returning the quoted AST returned by the parser. Here's the code for my expander, in expander.rkt:
#lang br/quicklang
(define-macro (bf-module-begin PARSE-TREE)
#'(#%module-begin
PARSE-TREE))
(provide (rename-out [bf-module-begin #%module-begin]))
And finally, here is the code I'm trying to tokenize/parse:
#lang reader "reader.rkt"
select * from table
When I run this in DrRacket in the same folder as the above files, I am met with the following error:
Encountered parsing error near "select" (token 'select) while parsing #<path:/Users/alex/SeaQuill/basic.rkt> [line=#f, column=#f, offset=#f]
I'd like to be able to generate an AST so I can start working on my expander, but I'm quite lost! Ideally, the code above would generate the following tokenization:
(list "select"
(token 'WORD "*")
"from"
(token 'WORD "table")))
For example, which I could then pass to my parser. But nay.
Update:
I think I've made some progress by changing my tokenizer to look like this:
(require brag/support)
(define (make-tokenizer port)
(define (next-token)
(define bf-lexer
(lexer
[whitespace (token lexeme #:skip? #t)]
["select" lexeme]
[(:seq alphabetic) (token 'WORD lexeme)]))
(bf-lexer port))
next-token)
When I run select field from table I now get the error:
Encountered parsing error near "h" (token 'WORD) while parsing #<path:/Users/alex/SeaQuill/basic.rkt> [line=#f, column=#f, offset=#f]