Mercurial > core / lisp/lib/parse/tests.lisp
changeset 358: |
ee8a3a0c57b8 |
parent: |
2a4f11c0e8c8
|
child: |
9472976adda9 |
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Wed, 22 May 2024 18:19:23 -0400 |
permissions: |
-rw-r--r-- |
description: |
add smart-buffer, finish porting of FAST-HTTP |
1 ;;; lib/parse/tests.lisp --- Parser Tests 6 (defpackage :parse/tests 7 (:use :cl :rt :std :parse)) 9 (in-package :parse/tests) 16 (with-lexer-environment ("<foo>") 17 (when (char= #\< (consume)) 18 (consume-until (make-matcher (is #\>))))) 22 (with-lexer-environment ("foo bar baz") 23 (consume-until (make-matcher (is q))))) 26 (defun digitp (c) (member c '(#\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\0))) 28 (defun simple-lexer (stream) 29 (let ((c (read-char stream nil nil))) 31 ((null c) (values nil nil)) 32 ((member c '(#\Space #\Tab #\Newline)) (simple-lexer stream)) 33 ((member c '(#\+ #\- #\* #\/ #\( #\))) 34 (let ((v (intern (string c)))) 37 (let ((buffer (make-array 10 :element-type 'character 39 (do ((c c (read-char stream nil nil))) 40 ((or (null c) (not (digitp c))) 41 (unless (null c) (unread-char c stream)) 42 (values 'int (read-from-string buffer))) 43 (vector-push-extend c buffer)))) 45 (let ((buffer (make-array 10 :element-type 'character 47 (do ((c c (read-char stream nil nil))) 48 ((or (null c) (not (alphanumericp c))) 49 (unless (null c) (unread-char c stream)) 50 (values 'id (copy-seq buffer))) 51 (vector-push-extend c buffer)))) 52 (t (error "Lexing error"))))) 54 (eval-when (:compile-toplevel :load-toplevel :execute) 55 (defun k-2-3 (a b c) (declare (ignore a c)) b) 58 (define-parser *left-expression-parser* 59 (:start-symbol expression) 60 (:terminals (int id + - * / |(| |)|)) 75 (|(| expression |)| #'k-2-3))) 77 (define-parser *ambiguous-expression-parser* 78 (:start-symbol expression) 79 (:terminals (int id + - * / |(| |)|)) 80 (:muffle-conflicts (16 0)) 83 (expression + expression) 84 (expression - expression) 85 (expression * expression) 86 (expression / expression) 89 (|(| expression |)| #'k-2-3))) 91 (define-parser *precedence-left-expression-parser* 92 (:start-symbol expression) 93 (:terminals (int id + - * / |(| |)|)) 94 (:precedence ((:left * /) (:left + -))) 97 (expression + expression) 98 (expression - expression) 99 (expression * expression) 100 (expression / expression) 103 (|(| expression |)| #'k-2-3))) 105 (define-parser *precedence-right-expression-parser* 106 (:start-symbol expression) 107 (:terminals (int id + - * / |(| |)|)) 108 (:precedence ((:right * /) (:right + -))) 111 (expression + expression) 112 (expression - expression) 113 (expression * expression) 114 (expression / expression) 117 (|(| expression |)| #'k-2-3))) 119 (define-parser *precedence-nonassoc-expression-parser* 120 (:start-symbol expression) 121 (:terminals (int id + - * / |(| |)|)) 122 (:precedence ((:nonassoc * /) (:nonassoc + -))) 125 (expression + expression) 126 (expression - expression) 127 (expression * expression) 128 (expression / expression) 131 (|(| expression |)| #'k-2-3))) 134 (flet ((parse (parser e) 135 (with-input-from-string (s e) 136 (parse-with-lexer #'(lambda () (simple-lexer s)) parser)))) 137 (let ((*package* (find-package :parse/tests))) 138 (let ((e "(x+3)+y*z") (v '(("x" + 3) + ("y" * "z")))) 139 (is (equal (parse *left-expression-parser* e) v)) 140 (is (equal (parse *precedence-left-expression-parser* e) v)) 141 (is (equal (parse *precedence-right-expression-parser* e) v)) 142 (is (equal (parse *precedence-nonassoc-expression-parser* e) v))) 143 (let ((e "x+5/3*(12+y)/3+z")) 144 (let ((v '(("x" + (((5 / 3) * (12 + "y")) / 3)) + "z"))) 145 (is (equal (parse *left-expression-parser* e) v)) 146 (is (equal (parse *precedence-left-expression-parser* e) v))) 147 (let ((v '("x" + ((5 / (3 * ((12 + "y") / 3))) + "z")))) 148 (is (equal (parse *precedence-right-expression-parser* e) v))) 149 (let ((v '("x" + (5 / (3 * ((12 + "y") / (3 + "z"))))))) 150 (is (equal (parse *ambiguous-expression-parser* e) v))) 151 (signals yacc-parse-error 152 (parse *precedence-nonassoc-expression-parser* e))) 153 (dolist (e '("5/3*(" "5/3)")) 154 (signals yacc-parse-error 155 (parse *left-expression-parser* e)) 156 (signals yacc-parse-error 157 (parse *ambiguous-expression-parser* e)) 158 (signals yacc-parse-error 159 (parse *precedence-left-expression-parser* e)) 160 (signals yacc-parse-error 161 (parse *precedence-right-expression-parser* e))))))