编译原理课设, 很简单的类似scheme解释器
当然编译原理和scheme都是初入门, 理解很浅, 例如并不会写尾递归优化
词法分析支持正规文法和简单的正则表达式,语法分析使用LR1分析
git clone https://github.com/ShengRang/schepy
python main.py
当然也支持pypy, 更快速:
pypy main.py
你也可以通过修改语法/词法(regular_lex.txt/regex_lex.txt), 以及解释器的行为, 让解释器具有你想要的特性!
文法的范例参考 grammar.txt, 支持#和'''两种注释(和 Python 差不多) 无需指定终结符/非终结符, 分析程序自动判断
lexer 和 parser 的使用参考main.py, 大致都为先读入文法, 再编译, 后使用
lexer 可以在 compile
时指定解析类型为正规文法(grammar_type="regular"
)或正则表达式(grammar_type="regex"
)
parser 在 parse
时传入 handler
控制产生 LR 移进和规约动作时的行为
解释器部分只使用了分析树进行代码执行。
一些例子:
486 ; 表达式
(+ 137 349) ; 组合式
(+ (* 3 5) (- 10 6)) ; 组合式
(define size 2) ; 定义, 将2与size相关联
## (define (square x) (* x x)) ; 复合过程 (define (<name> <formal parameters>) <body>)
(square 21) ; 使用过程
(define (sum-of-squares x y) ; 复合过程
(+ (square x) (square y)))
(define (f a) ; 复合过程
(sum-of-squares (+ a 1) (* a 2)))
(f 5) ; 136
(define (abs x)
(cond ((> x 0) x) ; 条件表达式
((= x 0) 0)
((< x 0) (- x))))
(if (> x 0) (define y x) 2) ; if表达式 (if test-expr then-expr else-expr) (这个还是用函数实现比较好)
(lambda (x) (+ x 5)) ; lambda表达式 (lambda kw-formals body ...+)
; 延迟求值
(+ (* 3 5) (- 10 6))
(define size 2)
(define x 3)
(if (> x 0) (define y x) 2)
(define a (foo b))
(define foo (lambda (x) (* x x)))
(define b 12)
a
; 实现filter
(define (filter fun s) (define first (car s))
(if (= (length s) 1)
(if (fun first) [first] [] )
(if (fun first) (append [first] (filter fun (cdr s))) (filter fun (cdr s)))
)
)
; 快排
(define quick-sort
(lambda (s)
(if (< (length s) 2)
s
(append
(quick-sort (filter (lambda (x) (< x (car s))) s ))
(filter (lambda (x) (= x (car s))) s)
(quick-sort (filter (lambda (x) (> x (car s))) s ))
)
)
)
)
(quick-sort [-6 -10 3 1 12 -5])
; [-10, -6, -5, 1, 3, 12]