summaryrefslogtreecommitdiffstats
path: root/ebnf.py
diff options
context:
space:
mode:
authorBenedikt Böhm <bb@xnull.de>2009-05-18 20:53:42 +0200
committerBenedikt Böhm <bb@xnull.de>2009-05-18 20:53:42 +0200
commit49f510d2d60129526832bfcd9c0f4049962bc80e (patch)
tree2828b773c75bdbc4014a3421c8046778a1a2b11b /ebnf.py
parent144258f0196b69cbdd2f29bd501276942efc3182 (diff)
downloadswppy-49f510d2d60129526832bfcd9c0f4049962bc80e.tar.gz
swppy-49f510d2d60129526832bfcd9c0f4049962bc80e.tar.xz
swppy-49f510d2d60129526832bfcd9c0f4049962bc80e.zip
move stuff around and create initial source structure
Diffstat (limited to 'ebnf.py')
-rw-r--r--ebnf.py152
1 files changed, 0 insertions, 152 deletions
diff --git a/ebnf.py b/ebnf.py
deleted file mode 100644
index 1989118..0000000
--- a/ebnf.py
+++ /dev/null
@@ -1,152 +0,0 @@
-import string
-
-class EBNF:
- IDENT = 0
- LITERAL = 2
- LPAREN = 3
- LBRAK = 4
- LBRACE = 5
- BAR = 6
- EQL = 7
- RPAREN = 8
- RBRAK = 9
- RBRACE = 10
- PERIOD = 11
- OTHER = 12
-
- __input__ = None
- __char__ = None
- __symbol__ = None
- __data__ = None
-
- def __init__(self, input):
- self.__input__ = input
- self.__get_char__()
-
- def __get_char__(self):
- self.__char__ = self.__input__.read(1)
- if self.__char__ == '':
- raise EOFError
- return self.__char__
-
- def __get_sym__(self):
- self.__data__ = None
-
- while self.__char__ in string.whitespace:
- self.__get_char__()
-
- if self.__char__ in string.letters + "_":
- self.__symbol__ = self.IDENT
- self.__data__ = self.__char__
- while self.__get_char__() in string.letters + "_":
- self.__data__ += self.__char__
- return
-
- elif self.__char__ == '"':
- self.__symbol__ = self.LITERAL
- self.__data__ = ""
- while self.__get_char__() != '"':
- self.__data__ += self.__char__
-
- elif self.__char__ == '=':
- self.__symbol__ = self.EQL
- elif self.__char__ == '(':
- self.__symbol__ = self.LPAREN
- elif self.__char__ == ')':
- self.__symbol__ = self.RPAREN
- elif self.__char__ == '[':
- self.__symbol__ = self.LBRAK
- elif self.__char__ == ']':
- self.__symbol__ = self.RBRAK
- elif self.__char__ == '{':
- self.__symbol__ = self.LBRACE
- elif self.__char__ == '}':
- self.__symbol__ = self.RBRACE
- elif self.__char__ == '|':
- self.__symbol__ = self.BAR
- elif self.__char__ == '.':
- self.__symbol__ = self.PERIOD
- else:
- self.__symbol__ = self.OTHER
-
- self.__get_char__()
-
- def __error__(self, num):
- pos = self.__input__.tell()
- if pos > self.__lastpos__ + 2:
- print "ERROR: pos=%d, err=%d, sym=%d" % (pos, num, self.__symbol__)
- self.__lastpos__ = pos
-
- def __expression__(self):
- self.__term__()
- while self.__symbol__ == self.BAR:
- self.__get_sym__()
- self.__term__()
-
- def __term__(self):
- self.__factor__()
- while self.__symbol__ < self.BAR:
- self.__factor__()
-
- def __factor__(self):
- if self.__symbol__ == self.IDENT:
- print "record(TO, '%s', 1)" % (self.__data__,)
- self.__get_sym__()
- elif self.__symbol__ == self.LITERAL:
- print "record(T1, '%s', 0)" % (self.__data__,)
- self.__get_sym__()
- elif self.__symbol__ == self.LPAREN:
- self.__get_sym__()
- self.__expression__()
- if self.__symbol__ == self.RPAREN:
- self.__get_sym__()
- else:
- self.__error__(2)
- elif self.__symbol__ == self.LBRAK:
- self.__get_sym__()
- self.__expression__()
- if self.__symbol__ == self.RBRAK:
- self.__get_sym__()
- else:
- self.__error__(3)
- elif self.__symbol__ == self.LBRACE:
- self.__get_sym__()
- self.__expression__()
- if self.__symbol__ == self.RBRACE:
- self.__get_sym__()
- else:
- self.__error__(4)
- else:
- self.__error__(5)
-
- def __production__(self):
- self.__get_sym__()
-
- if self.__symbol__ == self.EQL:
- self.__get_sym__()
- else:
- self.__error__(7)
-
- self.__expression__()
-
- if self.__symbol__ == self.PERIOD:
- self.__get_sym__()
- else:
- self.__error__(8)
-
- def __syntax__(self):
- while self.__symbol__ == self.IDENT:
- self.__production__()
-
- def compile(self):
- try:
- self.__lastpos__ = 0
- self.__get_sym__()
- self.__syntax__()
- except EOFError:
- return
-
-if __name__ == '__main__':
- import sys
- ebnf = EBNF(sys.stdin)
- ebnf.compile()