changelog shortlog graph tags branches changeset files revisions annotate raw help

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
2 
3 ;;
4 
5 ;;; Code:
6 (defpackage :parse/tests
7  (:use :cl :rt :std :parse))
8 
9 (in-package :parse/tests)
10 
11 (defsuite :parse)
12 (in-suite :parse)
13 
14 (deftest lex ()
15  (is (string=
16  (with-lexer-environment ("<foo>")
17  (when (char= #\< (consume))
18  (consume-until (make-matcher (is #\>)))))
19  "foo"))
20  (is (string=
21  (let ((q "baz"))
22  (with-lexer-environment ("foo bar baz")
23  (consume-until (make-matcher (is q)))))
24  "foo bar ")))
25 
26 (defun digitp (c) (member c '(#\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\0)))
27 
28 (defun simple-lexer (stream)
29  (let ((c (read-char stream nil nil)))
30  (cond
31  ((null c) (values nil nil))
32  ((member c '(#\Space #\Tab #\Newline)) (simple-lexer stream))
33  ((member c '(#\+ #\- #\* #\/ #\( #\)))
34  (let ((v (intern (string c))))
35  (values v v)))
36  ((digitp c)
37  (let ((buffer (make-array 10 :element-type 'character
38  :fill-pointer 0)))
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))))
44  ((alpha-char-p c)
45  (let ((buffer (make-array 10 :element-type 'character
46  :fill-pointer 0)))
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")))))
53 
54 (eval-when (:compile-toplevel :load-toplevel :execute)
55  (defun k-2-3 (a b c) (declare (ignore a c)) b)
56  )
57 
58 (define-parser *left-expression-parser*
59  (:start-symbol expression)
60  (:terminals (int id + - * / |(| |)|))
61 
62  (expression
63  (expression + term)
64  (expression - term)
65  term)
66 
67  (term
68  (term * factor)
69  (term / factor)
70  factor)
71 
72  (factor
73  id
74  int
75  (|(| expression |)| #'k-2-3)))
76 
77 (define-parser *ambiguous-expression-parser*
78  (:start-symbol expression)
79  (:terminals (int id + - * / |(| |)|))
80  (:muffle-conflicts (16 0))
81 
82  (expression
83  (expression + expression)
84  (expression - expression)
85  (expression * expression)
86  (expression / expression)
87  id
88  int
89  (|(| expression |)| #'k-2-3)))
90 
91 (define-parser *precedence-left-expression-parser*
92  (:start-symbol expression)
93  (:terminals (int id + - * / |(| |)|))
94  (:precedence ((:left * /) (:left + -)))
95 
96  (expression
97  (expression + expression)
98  (expression - expression)
99  (expression * expression)
100  (expression / expression)
101  id
102  int
103  (|(| expression |)| #'k-2-3)))
104 
105 (define-parser *precedence-right-expression-parser*
106  (:start-symbol expression)
107  (:terminals (int id + - * / |(| |)|))
108  (:precedence ((:right * /) (:right + -)))
109 
110  (expression
111  (expression + expression)
112  (expression - expression)
113  (expression * expression)
114  (expression / expression)
115  id
116  int
117  (|(| expression |)| #'k-2-3)))
118 
119 (define-parser *precedence-nonassoc-expression-parser*
120  (:start-symbol expression)
121  (:terminals (int id + - * / |(| |)|))
122  (:precedence ((:nonassoc * /) (:nonassoc + -)))
123 
124  (expression
125  (expression + expression)
126  (expression - expression)
127  (expression * expression)
128  (expression / expression)
129  id
130  int
131  (|(| expression |)| #'k-2-3)))
132 
133 (deftest yacc ()
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))))))