Map Greek letters to their ASCII equivalents.
Chris Pressey
6 years ago
74 | 74 |
* Output scenarios to JSON.
|
75 | 75 |
* Python 3 support.
|
76 | 76 |
* Allow comments in source file. Probably `#` or `//`.
|
77 | |
* Say that Greek letter variables are exactly equivalent to `?rho`, etc.
|
78 | |
* `!` for not.
|
79 | 77 |
* Consider a simple equality rule.
|
80 | 78 |
* Consider allowing `∨`.
|
81 | 79 |
* Take AST code from SixtyPical or ALPACA (or try to do better, perhaps with
|
14 | 14 |
self.unifier = unifier
|
15 | 15 |
|
16 | 16 |
def to_json(self):
|
17 | |
u = dict([(str(k), str(v)) for k, v in self.unifier.items()])
|
|
17 |
u = dict([(unicode(k), unicode(v)) for k, v in self.unifier.items()])
|
18 | 18 |
return [self.rule.to_json(), u]
|
19 | 19 |
|
20 | 20 |
def __str__(self):
|
85 | 85 |
return Cond(exprs=exprs)
|
86 | 86 |
|
87 | 87 |
def expr(self):
|
88 | |
if self.scanner.consume('~', u'¬'):
|
|
88 |
if self.scanner.consume('~', u'¬', '!'):
|
89 | 89 |
return Retract(term=self.term())
|
90 | 90 |
else:
|
91 | 91 |
return Assert(term=self.term())
|
92 | 92 |
|
93 | 93 |
def term(self):
|
94 | |
if self.scanner.on_type('variable') or self.scanner.on_type('qmark'):
|
|
94 |
if self.scanner.on_type('variable'):
|
95 | 95 |
return self.var()
|
96 | 96 |
self.scanner.check_type('word', 'punct')
|
97 | 97 |
constructor = self.scanner.token
|
|
105 | 105 |
return Term(constructor, *subterms)
|
106 | 106 |
|
107 | 107 |
def var(self):
|
108 | |
#self.scanner.check_type('variable')
|
|
108 |
self.scanner.check_type('variable')
|
109 | 109 |
name = self.scanner.token
|
110 | 110 |
self.scanner.scan()
|
111 | 111 |
v = Var(name)
|
0 | 0 |
# encoding: UTF-8
|
1 | 1 |
|
2 | 2 |
import re
|
|
3 |
|
|
4 |
|
|
5 |
GREEK = [
|
|
6 |
(u'?alpha', u'α'),
|
|
7 |
(u'?beta', u'β'),
|
|
8 |
(u'?gamma', u'γ'),
|
|
9 |
(u'?delta', u'δ'),
|
|
10 |
(u'?epsilon', u'ε'),
|
|
11 |
(u'?zeta', u'ζ'),
|
|
12 |
(u'?theta', u'θ'),
|
|
13 |
(u'?iota', u'ι'),
|
|
14 |
(u'?kappa', u'κ'),
|
|
15 |
(u'?lambda', u'λ'),
|
|
16 |
(u'?mu', u'μ'),
|
|
17 |
(u'?nu', u'ν'),
|
|
18 |
(u'?xi', u'ξ'),
|
|
19 |
(u'?omicron', u'ο'),
|
|
20 |
(u'?pi', u'π'),
|
|
21 |
(u'?rho', u'ρ'),
|
|
22 |
(u'?sigma', u'σ'),
|
|
23 |
(u'?tau', u'τ'),
|
|
24 |
(u'?upsilon', u'υ'),
|
|
25 |
(u'?phi', u'φ'),
|
|
26 |
(u'?chi', u'χ'),
|
|
27 |
(u'?psi', u'ψ'),
|
|
28 |
(u'?omega', u'ω'),
|
|
29 |
]
|
3 | 30 |
|
4 | 31 |
|
5 | 32 |
class Scanner(object):
|
|
36 | 63 |
if self.scan_pattern(ur'\~|→|=|¬|∧|∨', 'operator'):
|
37 | 64 |
return
|
38 | 65 |
# TODO: not sure about the ? overloading (here and in punct). should be okay though?
|
39 | |
if self.scan_pattern(r'\?[a-zA-Z_]+', 'qmark'):
|
|
66 |
if self.scan_pattern(r'\?[a-zA-Z_]+', 'variable'):
|
40 | 67 |
return
|
41 | 68 |
if self.scan_pattern(r'\,|\.|\?|\!|\"' + r"|\'", 'punct'):
|
42 | 69 |
return
|
|
45 | 72 |
if self.scan_pattern(r'[a-zA-Z_]+', 'word'):
|
46 | 73 |
return
|
47 | 74 |
if self.scan_pattern(ur'[αβγδεζθικλμνξοπρστυφχψω]', 'variable'):
|
|
75 |
for varname, letter in GREEK:
|
|
76 |
if letter == self.token:
|
|
77 |
self.token = varname
|
|
78 |
break
|
|
79 |
assert self.token.startswith('?'), repr(self.token)
|
48 | 80 |
return
|
49 | 81 |
if self.scan_pattern(r'.', 'unknown character'):
|
50 | 82 |
return
|