File: lisp.py

package info (click to toggle)
simpleparse 2.1.0a1-6
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 2,776 kB
  • ctags: 4,332
  • sloc: python: 7,036; ansic: 6,395; makefile: 22
file content (65 lines) | stat: -rwxr-xr-x 1,802 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""Basic LISP parser

We use library items, so we get " strings, float, int, and hex
atoms, as well as lists.  Note: Lisp doesn't seem to
use "," for seperating atoms in lists?  I don't really
remember it well enough to recall, but seems to match the
samples I see.

Note: Original grammar was from a sample in the YAPPS
documentation.  Though it's kinda hard to recognise here.
"""

definition = r"""
### A simple LISP parser

<ts>        := [ \t\n\r]*
<nameChar>  := [-+*/!@%^&=.a-zA-Z0-9_]
quote       := "'"
name        := nameChar+
>atom<      := quote / string_double_quote / list / number_expr / name

# numbers are regular number values followed
# by something that is _not_ a nameCharacter
number_expr := number, ?-(nameChar)
list        := "(", seq?, ")"!
>seq<       := ts, atom, (ts,atom)*, ts
"""
from simpleparse.parser import Parser
from simpleparse.common import strings, numbers
from simpleparse.dispatchprocessor import *

parser = Parser( definition, 'atom' )

if __name__ == "__main__":
	from simpleparse.stt.TextTools import print_tags

	shouldParse = [
		"(+ 2 3)",
		"(- 2 3)",
		"(* 2 3)",
		"(quote (2 3 4))",
		"(23s (2.4s 3s 45.3))",
		"(() () (2 3 4))",
		"()",
		'''("thisand that" ())''',
		'"this"',
		'''('"this")''',
		'''("this\n\r" ' those (+ a b) (23s 0xa3 55.3) "s")''',
		r'''("this\n\r" ' those (+ a b) (23s 0xa3 55.3) "s")''',
		r'''("this\n\r" ' those (+ a b) (23s 0xa3 55.3] "s")''',
		'''("this\n\r" ' those (+ a b) (23s 0xa3 55.3\n\n] "s")''',
		'''(with-pedantry :high It's "Scheme In One Defun".)''',

	]
	import pprint
	for item in shouldParse:
		try:
			success, children, next = parser.parse( item )
			if not success:
				print 'fail', item
			else:
				print 'success', item, next
				pprint.pprint( children )
		except SyntaxError, err:
			print err