0 | |
from collections import namedtuple
|
1 | |
|
|
0 |
from eqthy.objects import (
|
|
1 |
Document, Axiom, Theorem, Step,
|
|
2 |
Reflexivity, Substitution, Congruence, Reference
|
|
3 |
)
|
2 | 4 |
from eqthy.scanner import Scanner, EqthySyntaxError
|
3 | 5 |
from eqthy.terms import Term, Variable, Eqn
|
4 | 6 |
|
|
16 | 18 |
# Term := Var | Ctor ["(" [Term {"," Term} ")"].
|
17 | 19 |
|
18 | 20 |
|
19 | |
Document = namedtuple('Document', ['axioms', 'theorems'])
|
20 | |
Axiom = namedtuple('Axiom', ['name', 'eqn'])
|
21 | |
Theorem = namedtuple('Theorem', ['name', 'eqn', 'steps'])
|
22 | |
Step = namedtuple('Step', ['eqn', 'hint'])
|
23 | |
Reflexivity = namedtuple('Reflexivity', [])
|
24 | |
Substitution = namedtuple('Substitution', ['term', 'variable'])
|
25 | |
Congruence = namedtuple('Congruence', ['variable', 'term'])
|
26 | |
Reference = namedtuple('Reference', ['name', 'side'])
|
27 | |
|
28 | |
|
29 | 21 |
class Parser(object):
|
30 | 22 |
def __init__(self, text, filename):
|
31 | 23 |
self.scanner = Scanner(text, filename)
|
|
40 | 32 |
while self.scanner.on('theorem'):
|
41 | 33 |
theorems.append(self.theorem())
|
42 | 34 |
if not (axioms or theorems):
|
43 | |
raise EqthySyntaxError(self.scanner.filename, self.scanner.line_number, "Eqthy document is empty")
|
|
35 |
raise EqthySyntaxError(
|
|
36 |
self.scanner.filename,
|
|
37 |
self.scanner.line_number,
|
|
38 |
"Eqthy document is empty"
|
|
39 |
)
|
44 | 40 |
return Document(axioms=axioms, theorems=theorems)
|
45 | 41 |
|
46 | 42 |
def axiom(self):
|