chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chicken-users] Comparse recursive parser


From: Joe Anonimist
Subject: [Chicken-users] Comparse recursive parser
Date: Sat, 16 Feb 2019 19:33:08 +0000

Hello,


I am trying to build a simple arithmetic expression evaluator using 
Comparse. I have got to the part of the grammar that looks like this




<MultExpr> ::= <MultExpr> '*' <UnaryExpr>
             | <MultExpr> '/' <UnaryExpr>
             | <UnaryExpr>


ie it is recursive. Here is my code so far:


(import comparse)
(import srfi-14)


(define digit
   (in char-set:digit))


(define space
   (in (string->list " \n")))


(define (optional-ws parser)
   (enclosed-by
    (zero-or-more space)
    parser
    (zero-or-more space)))


(define (token tok-name parser)
   (bind parser
     (lambda (res)
       (result (list tok-name res)))))


(define int-literal
   (token 'int-literal
      (optional-ws
       (as-string(one-or-more digit)))))


(define hex-digit
   (in char-set:hex-digit))


(define hex-literal
   (token 'hex-literal
      (optional-ws
       (as-string (one-or-more hex-digit)))))


(define oct-digit
   (in (string->list "01234567")))


(define oct-literal
   (token 'oct-literal
      (optional-ws
       (as-string (one-or-more oct-digit)))))


(define bool-literal
   (token 'bool-literal
      (optional-ws
       (any-of
        (char-seq "True")
        (char-seq "False")))))


(define const-expr
   (token 'const-expr
      (any-of
       int-literal
       hex-literal
       oct-literal
       bool-literal)))


(define mult-expr
   (recursive-parser
   (token 'mult-expr
      (any-of
       (sequence mult-expr (char-seq "*") const-expr)
       (sequence mult-expr (char-seq "/") const-expr)
       const-expr))))


Unfortunately the recursive-parser procedure is not documented and the 
above code just keeps looping.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]