v6.3-exception
Matthew Butterick 7 years ago
parent 545b4229fb
commit f21e0f7c20

@ -1,32 +1,16 @@
#lang brag #lang brag
chip-program : /"CHIP" chipname /"{" in-spec out-spec part-spec /"}" chip-program : /"CHIP" chipname /"{" in-spec out-spec part-spec /"}"
@chipname : ID @chipname : ID
in-spec : pin-spec in-spec : pin-spec
out-spec : pin-spec out-spec : pin-spec
@pin-spec : (/"IN" | /"OUT") pin [/"," pin]* /";" @pin-spec : (/"IN" | /"OUT") pin [/"," pin]* /";"
/pin : ID [/"[" NUMBER /"]"] /pin : ID [/"[" NUMBER /"]"]
@part-spec : /"PARTS:" part+ @part-spec : /"PARTS:" part+
part : partname /"(" wire-assign [/"," wire-assign]* /")" /";" part : partname /"(" wire-assign [/"," wire-assign]* /")" /";"
@partname : ID @partname : ID
/wire-assign : pin-range /"=" pin-val /wire-assign : pin-range /"=" pin-val
/pin-range : ID [/"[" bus-range /"]"] /pin-range : ID [/"[" bus-range /"]"]
@bus-range : number [/"." /"." number] @bus-range : number [/"." /"." number]
@pin-val : pin-range | BINARY-NUMBER | TRUE | FALSE
@pin-val : pin-range
| BINARY-NUMBER
| TRUE
| FALSE
@number : BINARY-NUMBER | NUMBER @number : BINARY-NUMBER | NUMBER

@ -1,4 +1,28 @@
#lang br/quicklang #lang br/quicklang
(module reader br (require "grammar.rkt"
(require "reader.rkt") brag/support)
(define-lex-abbrev reserved-terms
(union "CHIP" "IN" "OUT" "PARTS:" (char-set "[]{}(),;=.")))
(define tokenize
(lexer-srcloc
[(:or (from/to "/*" "*/") (from/to "//" #\newline))
(token 'COMMENT lexeme #:skip? #t)]
[(:or #\tab #\space #\newline) (token 'WS #:skip? #t)]
[reserved-terms lexeme]
["true" (token 'TRUE #t)]
["false" (token 'FALSE #f)]
;; bugaboo: "10" is ambiguous: number or binary number?
[(:+ numeric) (token 'NUMBER (string->number lexeme))]
[(:+ (char-set "01")) (token 'BINARY-NUMBER (string->number lexeme 2))]
[(:seq alphabetic (:* (:or alphabetic numeric "-"))) (token 'ID (string->symbol lexeme))]))
(module+ reader
(provide read-syntax)) (provide read-syntax))
(define (read-syntax src ip)
(strip-context
(with-syntax ([PT (parse src (λ () (tokenize ip)))])
#'(module hdl-mod hdl-demo/expander
PT))))

@ -1,8 +0,0 @@
#lang br
(require "parser.rkt" "tokenizer.rkt")
(provide read-syntax)
(define (read-syntax src ip)
(strip-context
(with-syntax ([PT (parse src (tokenize ip))])
#'(module hdl-mod hdl-demo/expander
PT))))

@ -1,24 +0,0 @@
#lang br
(require brag/support
racket/string)
(provide tokenize)
(define (tokenize input-port)
(define (next-token)
(define get-token
(lexer-src-pos
[(union
(:seq "/*" (complement (:seq any-string "*/" any-string)) "*/")
(:seq "//" (repetition 1 +inf.0 (char-complement #\newline)) #\newline))
(token 'COMMENT lexeme #:skip? #t)]
[(union #\tab #\space #\newline) (return-without-pos (get-token input-port))]
[(union "CHIP" "IN" "OUT" "PARTS:") lexeme]
[(char-set "[]{}(),;=.") lexeme]
["true" (token 'TRUE #t)]
["false" (token 'FALSE #f)]
[(repetition 1 +inf.0 numeric) (token 'NUMBER (string->number lexeme))]
; bugaboo: "10" is ambiguous: number or binary number?
[(repetition 1 +inf.0 (char-set "01")) (token 'BINARY-NUMBER (string->number lexeme 2))]
[(:seq (repetition 1 1 alphabetic) (repetition 0 +inf.0 (union alphabetic numeric "-"))) (token 'ID (string->symbol lexeme))]))
(get-token input-port))
next-token)
Loading…
Cancel
Save