[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.
- [Chicken-users] Comparse recursive parser,
Joe Anonimist <=