From: <ka...@us...> - 2009-07-27 15:41:02
|
Revision: 2250 http://paintown.svn.sourceforge.net/paintown/?rev=2250&view=rev Author: kazzmir Date: 2009-07-27 15:40:55 +0000 (Mon, 27 Jul 2009) Log Message: ----------- add start of peg generator Added Paths: ----------- trunk/src/mugen/parser/peg.py Added: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py (rev 0) +++ trunk/src/mugen/parser/peg.py 2009-07-27 15:40:55 UTC (rev 2250) @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +next_var = 0 +def nextVar(): + global next_var; + next_var += 1; + return next_var + +class Pattern: + def __init__(self): + pass + + def generate(self, result): + pass + +class PatternNot(Pattern): + def __init__(self, next): + Pattern.__init__(self) + self.next = next + + def generate(self, result): + my_result = "result_%d" % nextVar() + data = """ +Result %s = 0; +%s +%s = ! %s; + """ % (my_result, self.next.generate(my_result), result, my_result) + + return data + +class PatternVerbatim(Pattern): + def __init__(self, letters): + Pattern.__init__(self) + self.letters = letters + + def generate(self, result): + data = """ +%s = "%s"; + """ % (result, self.letters) + return data + +class Rule: + def __init__(self, name, patterns): + self.name = name + self.patterns = patterns + + def generate(self): + result = "result_%d" % nextVar() + data = """ +static Result rule_%s(){ + Result %s = 0; + %s + return Result; +} + """ % (self.name, result, '\n'.join([pattern.generate(result) for pattern in self.patterns])) + + return data + +class Peg: + def __init__(self, start, rules): + self.start = start + self.rules = rules + + def generate(self): + namespace = "Peg" + data = """ +namespace %s{ + %s + + Result main(){ + return rule_%s(); + } +} + """ % (namespace, '\n'.join([rule.generate() for rule in self.rules]), self.start) + + return data + +def generate(peg): + print peg.generate() + +def test(): + rules = [ + Rule("s", [PatternNot(PatternVerbatim("hello"))]), + ] + peg = Peg("s", rules) + generate(peg) + +test() Property changes on: trunk/src/mugen/parser/peg.py ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 15:42:42
|
Revision: 2251 http://paintown.svn.sourceforge.net/paintown/?rev=2251&view=rev Author: kazzmir Date: 2009-07-27 15:42:34 +0000 (Mon, 27 Jul 2009) Log Message: ----------- typo Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 15:40:55 UTC (rev 2250) +++ trunk/src/mugen/parser/peg.py 2009-07-27 15:42:34 UTC (rev 2251) @@ -50,9 +50,9 @@ static Result rule_%s(){ Result %s = 0; %s - return Result; + return %s; } - """ % (self.name, result, '\n'.join([pattern.generate(result) for pattern in self.patterns])) + """ % (self.name, result, '\n'.join([pattern.generate(result) for pattern in self.patterns]), result) return data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 15:43:36
|
Revision: 2252 http://paintown.svn.sourceforge.net/paintown/?rev=2252&view=rev Author: kazzmir Date: 2009-07-27 15:43:28 +0000 (Mon, 27 Jul 2009) Log Message: ----------- info Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 15:42:34 UTC (rev 2251) +++ trunk/src/mugen/parser/peg.py 2009-07-27 15:43:28 UTC (rev 2252) @@ -1,5 +1,8 @@ #!/usr/bin/env python +# Packrat PEG (parsing expression grammar) generator +# http://pdos.csail.mit.edu/~baford/packrat/ + next_var = 0 def nextVar(): global next_var; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 15:48:46
|
Revision: 2253 http://paintown.svn.sourceforge.net/paintown/?rev=2253&view=rev Author: kazzmir Date: 2009-07-27 15:48:36 +0000 (Mon, 27 Jul 2009) Log Message: ----------- add rule pattern Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 15:43:28 UTC (rev 2252) +++ trunk/src/mugen/parser/peg.py 2009-07-27 15:48:36 UTC (rev 2253) @@ -31,6 +31,18 @@ return data +class PatternRule(Pattern): + def __init__(self, rule): + Pattern.__init__(self) + self.rule = rule + + def generate(self, result): + data = """ +%s = rule_%s(); + """ % (result, self.rule) + + return data + class PatternVerbatim(Pattern): def __init__(self, letters): Pattern.__init__(self) @@ -84,6 +96,7 @@ def test(): rules = [ Rule("s", [PatternNot(PatternVerbatim("hello"))]), + Rule("blah", [PatternRule("s")]) ] peg = Peg("s", rules) generate(peg) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 17:52:34
|
Revision: 2254 http://paintown.svn.sourceforge.net/paintown/?rev=2254&view=rev Author: kazzmir Date: 2009-07-27 17:52:27 +0000 (Mon, 27 Jul 2009) Log Message: ----------- fix indentation. add empty patterns Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 15:48:36 UTC (rev 2253) +++ trunk/src/mugen/parser/peg.py 2009-07-27 17:52:27 UTC (rev 2254) @@ -9,6 +9,10 @@ next_var += 1; return next_var +def indent(s): + space = ' ' + return s.replace('\n', '\n%s' % space) + class Pattern: def __init__(self): pass @@ -27,7 +31,7 @@ Result %s = 0; %s %s = ! %s; - """ % (my_result, self.next.generate(my_result), result, my_result) + """ % (my_result, self.next.generate(my_result).strip(), result, my_result) return data @@ -43,6 +47,27 @@ return data +class PatternRepeatOnce(Pattern): + def __init__(self, next): + Pattern.__init__(self) + self.next = next + + def generate(self, result): + data = """ + """ + + return data + +class PatternRepeatMany(Pattern): + def __init__(self, next): + Pattern.__init__(self) + self.next = next + + def generate(self, result): + data = """ + """ + return data + class PatternVerbatim(Pattern): def __init__(self, letters): Pattern.__init__(self) @@ -67,7 +92,7 @@ %s return %s; } - """ % (self.name, result, '\n'.join([pattern.generate(result) for pattern in self.patterns]), result) + """ % (self.name, result, indent('\n'.join([pattern.generate(result).strip() for pattern in self.patterns])), result) return data @@ -82,10 +107,11 @@ namespace %s{ %s - Result main(){ - return rule_%s(); - } +Result main(){ + return rule_%s(); } + +} """ % (namespace, '\n'.join([rule.generate() for rule in self.rules]), self.start) return data This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 18:02:16
|
Revision: 2255 http://paintown.svn.sourceforge.net/paintown/?rev=2255&view=rev Author: kazzmir Date: 2009-07-27 18:02:09 +0000 (Mon, 27 Jul 2009) Log Message: ----------- loops Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 17:52:27 UTC (rev 2254) +++ trunk/src/mugen/parser/peg.py 2009-07-27 18:02:09 UTC (rev 2255) @@ -9,6 +9,9 @@ next_var += 1; return next_var +def newResult(): + return "result_%d" % nextVar() + def indent(s): space = ' ' return s.replace('\n', '\n%s' % space) @@ -26,7 +29,7 @@ self.next = next def generate(self, result): - my_result = "result_%d" % nextVar() + my_result = newResult() data = """ Result %s = 0; %s @@ -53,6 +56,7 @@ self.next = next def generate(self, result): + result = newResult() data = """ """ @@ -65,7 +69,10 @@ def generate(self, result): data = """ - """ +do{ + %s; +} while (%s.ok()); + """ % (indent(self.next.generate(result).strip()), result) return data class PatternVerbatim(Pattern): @@ -85,7 +92,7 @@ self.patterns = patterns def generate(self): - result = "result_%d" % nextVar() + result = newResult() data = """ static Result rule_%s(){ Result %s = 0; @@ -122,7 +129,7 @@ def test(): rules = [ Rule("s", [PatternNot(PatternVerbatim("hello"))]), - Rule("blah", [PatternRule("s")]) + Rule("blah", [PatternRepeatMany(PatternRule("s"))]) ] peg = Peg("s", rules) generate(peg) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 20:41:29
|
Revision: 2256 http://paintown.svn.sourceforge.net/paintown/?rev=2256&view=rev Author: kazzmir Date: 2009-07-27 20:41:14 +0000 (Mon, 27 Jul 2009) Log Message: ----------- use failure continuation Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 18:02:09 UTC (rev 2255) +++ trunk/src/mugen/parser/peg.py 2009-07-27 20:41:14 UTC (rev 2256) @@ -12,6 +12,9 @@ def newResult(): return "result_%d" % nextVar() +def newOut(): + return "out_%d" % nextVar() + def indent(s): space = ' ' return s.replace('\n', '\n%s' % space) @@ -20,7 +23,7 @@ def __init__(self): pass - def generate(self, result): + def generate(self, result, stream, failure): pass class PatternNot(Pattern): @@ -28,13 +31,14 @@ Pattern.__init__(self) self.next = next - def generate(self, result): - my_result = newResult() + def generate(self, result, stream, failure): + not_label = "not_%d" % nextVar() + my_fail = lambda : "goto %s;" % not_label data = """ -Result %s = 0; %s -%s = ! %s; - """ % (my_result, self.next.generate(my_result).strip(), result, my_result) +%s +%s: + """ % (self.next.generate(result, stream, my_fail).strip(), failure(), not_label) return data @@ -43,10 +47,10 @@ Pattern.__init__(self) self.rule = rule - def generate(self, result): + def generate(self, result, stream, failure): data = """ -%s = rule_%s(); - """ % (result, self.rule) +%s = rule_%s(%s.getPosition()); + """ % (result, self.rule, result) return data @@ -55,24 +59,45 @@ Pattern.__init__(self) self.next = next - def generate(self, result): + def generate(self, result, stream, failure): result = newResult() data = """ """ return data +class PatternAction(Pattern): + def __init__(self, before, code): + Pattern.__init__(self) + self.before = before + self.code = code + + def generate(self, result, stream, failure): + data = """ +%s +{ + void * value = 0; + %s + %s.setValue(value); +} + """ % (self.before.generate(result, stream, failure).strip(), indent(self.code.strip()), result) + + return data + class PatternRepeatMany(Pattern): def __init__(self, next): Pattern.__init__(self) self.next = next - def generate(self, result): + def generate(self, result, stream, failure): + my_result = newResult() data = """ do{ - %s; + Result %s(%s.getPosition()); + %s + %s.addResult(%s); } while (%s.ok()); - """ % (indent(self.next.generate(result).strip()), result) + """ % (my_result, result, indent(self.next.generate(my_result, stream, failure).strip()), result, my_result, result) return data class PatternVerbatim(Pattern): @@ -80,10 +105,35 @@ Pattern.__init__(self) self.letters = letters - def generate(self, result): + def generate(self, result, stream, failure): data = """ %s = "%s"; """ % (result, self.letters) + + data = "" + + for letter in self.letters[::-1]: + newdata = """ +if (%s.get(%s.getPosition()) == '%s'){ + %s.nextPosition(); + %s +} else { + %s +} +""" % (stream, result, letter, result, indent(data), failure()) + data = newdata + + # return data + + data = """ +for (int i = 0; i < %d; i++){ + if ("%s"[i] == %s.get(%s.getPosition())){ + %s.nextPosition(); + } else { + %s + } +} +""" % (len(self.letters), self.letters, stream, result, result, failure()) return data class Rule: @@ -92,14 +142,27 @@ self.patterns = patterns def generate(self): - result = newResult() + def newPattern(pattern, stream, position): + result = newResult() + out = newOut() + def failure(): + return "goto %s;" % out + data = """ +Result %s(%s); +%s +%s.update(%s); +return %s; +%s: + """ % (result, position, pattern.generate(result, stream, failure).strip(), stream, result, result, out) + return data + + stream = "stream" + position = "position" data = """ -static Result rule_%s(){ - Result %s = 0; +static Result rule_%s(Stream & %s, const int %s){ %s - return %s; } - """ % (self.name, result, indent('\n'.join([pattern.generate(result).strip() for pattern in self.patterns])), result) + """ % (self.name, stream, position, indent('\n'.join([newPattern(pattern, stream, position).strip() for pattern in self.patterns]))) return data @@ -127,8 +190,12 @@ print peg.generate() def test(): + s_code = """ +printf("parsed cheese\\n"); +value = 2; +""" rules = [ - Rule("s", [PatternNot(PatternVerbatim("hello"))]), + Rule("s", [PatternNot(PatternVerbatim("hello")), PatternAction(PatternVerbatim("cheese"), s_code)]), Rule("blah", [PatternRepeatMany(PatternRule("s"))]) ] peg = Peg("s", rules) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 21:08:31
|
Revision: 2258 http://paintown.svn.sourceforge.net/paintown/?rev=2258&view=rev Author: kazzmir Date: 2009-07-27 21:08:23 +0000 (Mon, 27 Jul 2009) Log Message: ----------- add or rule Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 20:56:17 UTC (rev 2257) +++ trunk/src/mugen/parser/peg.py 2009-07-27 21:08:23 UTC (rev 2258) @@ -49,8 +49,11 @@ def generate(self, result, stream, failure): data = """ -%s = rule_%s(%s.getPosition()); - """ % (result, self.rule, result) +%s = rule_%s(%s, %s.getPosition()); +if (%s.error()){ + %s +} +""" % (result, self.rule, stream, result, result, failure()) return data @@ -60,9 +63,20 @@ self.next = next def generate(self, result, stream, failure): - result = newResult() + loop_done = "loop_%d" % nextVar() + my_fail = lambda : "goto %s;" % loop_done + my_result = newResult() data = """ - """ +do{ + Result %s(%s.getPosition()); + %s + %s.addResult(%s); +} while (true); +%s: +if (%s.matches() == 0){ + %s +} + """ % (my_result, result, indent(self.next.generate(my_result, stream, my_fail).strip()), result, my_result, loop_done, result, failure()) return data @@ -90,16 +104,43 @@ self.next = next def generate(self, result, stream, failure): + loop_done = "loop_%d" % nextVar() + my_fail = lambda : "goto %s;" % loop_done my_result = newResult() data = """ do{ Result %s(%s.getPosition()); %s %s.addResult(%s); -} while (%s.ok()); - """ % (my_result, result, indent(self.next.generate(my_result, stream, failure).strip()), result, my_result, result) +} while (true); +%s: + """ % (my_result, result, indent(self.next.generate(my_result, stream, my_fail).strip()), result, my_result, loop_done) return data +class PatternOr(Pattern): + def __init__(self, patterns): + Pattern.__init__(self) + self.patterns = patterns + + def generate(self, result, stream, failure): + data = "" + success = "success_%d" % nextVar() + for pattern in self.patterns: + out = "or_%d" % nextVar() + my_result = newResult() + fail = lambda : "goto %s;" % out + if pattern == self.patterns[-1]: + fail = failure + data += """ +Result %s(%s); +%s +%s = %s; +goto %s; +%s: +""" % (my_result, result, pattern.generate(my_result, stream, fail).strip(), result, my_result, success, out) + data += "%s:\n" % success + return data + class PatternVerbatim(Pattern): def __init__(self, letters): Pattern.__init__(self) @@ -161,6 +202,7 @@ data = """ static Result rule_%s(Stream & %s, const int %s){ %s + return errorResult; } """ % (self.name, stream, position, indent('\n'.join([newPattern(pattern, stream, position).strip() for pattern in self.patterns]))) @@ -195,8 +237,9 @@ value = 2; """ rules = [ - Rule("s", [PatternNot(PatternVerbatim("hello")), PatternAction(PatternVerbatim("cheese"), s_code)]), - Rule("blah", [PatternRepeatMany(PatternRule("s"))]) + Rule("s", [PatternNot(PatternVerbatim("hello")), PatternAction(PatternVerbatim("cheese"), s_code), PatternRepeatOnce(PatternVerbatim("once"))]), + Rule("blah", [PatternRepeatMany(PatternRule("s"))]), + Rule("or", [PatternOr([PatternVerbatim("joe"), PatternVerbatim("bob"), PatternVerbatim("sally")])]), ] peg = Peg("s", rules) generate(peg) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 21:40:19
|
Revision: 2260 http://paintown.svn.sourceforge.net/paintown/?rev=2260&view=rev Author: kazzmir Date: 2009-07-27 21:40:08 +0000 (Mon, 27 Jul 2009) Log Message: ----------- fill in classes, add sequence pattern Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 21:39:21 UTC (rev 2259) +++ trunk/src/mugen/parser/peg.py 2009-07-27 21:40:08 UTC (rev 2260) @@ -19,6 +19,75 @@ space = ' ' return s.replace('\n', '\n%s' % space) +start_code = """ +class Result{ +public: + Result(const int position): + position(position), + isError(false){ + } + + inline const int getPosition() const { + return position; + } + + inline bool error(){ + return isError; + } + + inline void nextPosition(){ + position += 1; + } + + void setError(){ + isError = true; + } + + void setValue(void * value){ + this->values.push_back(value); + } + + const int matches() const { + return this->values.size(); + } + + const std::vector<void *> & getValues() const { + return values; + } + + void addResult(const Result & result){ + const std::vector<void *> & his = result.getValues(); + this->values.insert(this->values.end(), his.begin(), his.end()); + this->position = result.getPosition(); + } + +private: + int position; + bool isError; + std::vector<void *> values; +}; + +class Stream{ +public: + Stream(){ + } + + char get(const int position){ + char z; + stream >> z; + return z; + } + + void update(const Result & result){ + } + +private: + std::ifstream stream; +}; + +Result errorResult(-1); +""" + class Pattern: def __init__(self): pass @@ -33,12 +102,14 @@ def generate(self, result, stream, failure): not_label = "not_%d" % nextVar() + my_result = newResult() my_fail = lambda : "goto %s;" % not_label data = """ +Result %s(%s); %s %s %s: - """ % (self.next.generate(result, stream, my_fail).strip(), failure(), not_label) + """ % (my_result, result, self.next.generate(my_result, stream, my_fail).strip(), failure(), not_label) return data @@ -57,6 +128,24 @@ return data +class PatternSequence(Pattern): + def __init__(self, patterns): + Pattern.__init__(self) + self.patterns = patterns + + def generate(self, result, stream, failure): + data = "" + for pattern in self.patterns: + my_result = newResult() + data += """ +{ +Result %s(%s.getPosition()); +%s +%s.addResult(%s); +} +""" % (my_result, result, pattern.generate(my_result, stream, failure), result, my_result) + return data + class PatternRepeatOnce(Pattern): def __init__(self, next): Pattern.__init__(self) @@ -132,9 +221,11 @@ if pattern == self.patterns[-1]: fail = failure data += """ -Result %s(%s); +{ +Result %s(%s.getPosition()); %s %s = %s; +} goto %s; %s: """ % (my_result, result, pattern.generate(my_result, stream, fail).strip(), result, my_result, success, out) @@ -200,7 +291,7 @@ stream = "stream" position = "position" data = """ -static Result rule_%s(Stream & %s, const int %s){ +Result rule_%s(Stream & %s, const int %s){ %s return errorResult; } @@ -216,15 +307,22 @@ def generate(self): namespace = "Peg" data = """ +#include <vector> +#include <fstream> + namespace %s{ %s + %s + Result main(){ - return rule_%s(); + Stream stream; + errorResult.setError(); + return rule_%s(stream, 0); } } - """ % (namespace, '\n'.join([rule.generate() for rule in self.rules]), self.start) + """ % (namespace, start_code, '\n'.join([rule.generate() for rule in self.rules]), self.start) return data @@ -234,12 +332,13 @@ def test(): s_code = """ printf("parsed cheese\\n"); -value = 2; +value = (void *) 2; """ rules = [ Rule("s", [PatternNot(PatternVerbatim("hello")), PatternAction(PatternVerbatim("cheese"), s_code), PatternRepeatOnce(PatternVerbatim("once"))]), Rule("blah", [PatternRepeatMany(PatternRule("s"))]), Rule("or", [PatternOr([PatternVerbatim("joe"), PatternVerbatim("bob"), PatternVerbatim("sally")])]), + Rule("all", [PatternSequence([PatternVerbatim("abc"), PatternVerbatim("def"), PatternVerbatim("ghi")])]), ] peg = Peg("s", rules) generate(peg) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 22:07:05
|
Revision: 2261 http://paintown.svn.sourceforge.net/paintown/?rev=2261&view=rev Author: kazzmir Date: 2009-07-27 22:06:58 +0000 (Mon, 27 Jul 2009) Log Message: ----------- make things work Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 21:40:08 UTC (rev 2260) +++ trunk/src/mugen/parser/peg.py 2009-07-27 22:06:58 UTC (rev 2261) @@ -69,11 +69,13 @@ class Stream{ public: - Stream(){ + Stream(const std::string & filename){ + stream.open(filename.c_str()); } char get(const int position){ char z; + stream.seekg(position, std::ios_base::beg); stream >> z; return z; } @@ -81,6 +83,14 @@ void update(const Result & result){ } + bool hasResult(const int position){ + return false; + } + + Result result(const int position){ + return Result(-1); + } + private: std::ifstream stream; }; @@ -292,37 +302,51 @@ position = "position" data = """ Result rule_%s(Stream & %s, const int %s){ + if (%s.hasResult(%s)){ + return %s.result(%s); + } %s return errorResult; } - """ % (self.name, stream, position, indent('\n'.join([newPattern(pattern, stream, position).strip() for pattern in self.patterns]))) + """ % (self.name, stream, position, stream, position, stream, position, indent('\n'.join([newPattern(pattern, stream, position).strip() for pattern in self.patterns]))) return data class Peg: - def __init__(self, start, rules): + def __init__(self, namespace, start, rules): + self.namespace = namespace self.start = start self.rules = rules def generate(self): - namespace = "Peg" + def prototype(rule): + return "Result rule_%s(Stream &, const int);" % rule.name + data = """ #include <vector> +#include <string> #include <fstream> +#include <iostream> namespace %s{ %s %s -Result main(){ - Stream stream; + %s + +std::vector<void *> main(const std::string & filename){ + Stream stream(filename); errorResult.setError(); - return rule_%s(stream, 0); + Result done = rule_%s(stream, 0); + if (done.error()){ + std::cout << "Could not parse" << std::endl; + } + return done.getValues(); } } - """ % (namespace, start_code, '\n'.join([rule.generate() for rule in self.rules]), self.start) + """ % (self.namespace, start_code, indent('\n'.join([prototype(rule) for rule in self.rules])), '\n'.join([rule.generate() for rule in self.rules]), self.start) return data @@ -340,7 +364,32 @@ Rule("or", [PatternOr([PatternVerbatim("joe"), PatternVerbatim("bob"), PatternVerbatim("sally")])]), Rule("all", [PatternSequence([PatternVerbatim("abc"), PatternVerbatim("def"), PatternVerbatim("ghi")])]), ] - peg = Peg("s", rules) + peg = Peg("Peg", "s", rules) generate(peg) -test() +def test2(): + start_code_abc = """ +std::cout << "Parsed abc!" << std::endl; +""" + start_code_def = """ +std::cout << "Parsed def!" << std::endl; +""" + rules = [ + Rule("start", [ + PatternAction(PatternSequence([PatternRule("a"),PatternRule("b"), PatternRule("c")]), start_code_abc), + PatternAction(PatternSequence([PatternRule("d"),PatternRule("e"), PatternRule("f")]), start_code_def), + ]), + Rule("a", [PatternVerbatim("a")]), + Rule("b", [PatternVerbatim("b")]), + Rule("c", [PatternVerbatim("c")]), + + Rule("d", [PatternVerbatim("d")]), + Rule("e", [PatternVerbatim("e")]), + Rule("f", [PatternVerbatim("f")]), + ] + + peg = Peg("Peg", "start", rules) + generate(peg) + +# test() +test2() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-27 23:39:18
|
Revision: 2263 http://paintown.svn.sourceforge.net/paintown/?rev=2263&view=rev Author: kazzmir Date: 2009-07-27 23:39:04 +0000 (Mon, 27 Jul 2009) Log Message: ----------- generate python peg Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 22:13:47 UTC (rev 2262) +++ trunk/src/mugen/parser/peg.py 2009-07-27 23:39:04 UTC (rev 2263) @@ -110,6 +110,20 @@ Pattern.__init__(self) self.next = next + def generate_python(self, result, stream, failure): + my_result = newResult() + my_fail = lambda : "raise PegError" + data = """ +%s = Result(%s); +try: + %s +except PegError: + %s + """ % (my_result, result, indent(self.next.generate_python(my_result, stream, my_fail).strip()), failure()) + + return data + + def generate(self, result, stream, failure): not_label = "not_%d" % nextVar() my_result = newResult() @@ -128,6 +142,15 @@ Pattern.__init__(self) self.rule = rule + def generate_python(self, result, stream, failure): + data = """ +%s = rule_%s(%s, %s.getPosition()) +if %s == None: + %s +""" % (result, self.rule, stream, result, result, failure()) + + return data + def generate(self, result, stream, failure): data = """ %s = rule_%s(%s, %s.getPosition()); @@ -143,6 +166,18 @@ Pattern.__init__(self) self.patterns = patterns + def generate_python(self, result, stream, failure): + data = "" + for pattern in self.patterns: + my_result = newResult() + data += """ +%s = Result(%s.getPosition()) +%s +%s.addResult(%s); +""" % (my_result, result, pattern.generate_python(my_result, stream, failure), result, my_result) + + return data + def generate(self, result, stream, failure): data = "" for pattern in self.patterns: @@ -161,6 +196,23 @@ Pattern.__init__(self) self.next = next + def generate_python(self, result, stream, failure): + loop_done = "loop_%d" % nextVar() + my_fail = lambda : "raise PegError" + my_result = newResult() + data = """ +try: + while True: + %s = Result(%s.getPosition()); + %s + %s.addResult(%s); +except PegError: + if %s.matches() == 0: + %s + """ % (my_result, result, indent(indent(self.next.generate_python(my_result, stream, my_fail).strip())), result, my_result, result, failure()) + + return data + def generate(self, result, stream, failure): loop_done = "loop_%d" % nextVar() my_fail = lambda : "goto %s;" % loop_done @@ -185,6 +237,17 @@ self.before = before self.code = code + def generate_python(self, result, stream, failure): + data = """ +%s +if True: + value = None + %s + %s.setValue(value) +""" % (self.before.generate_python(result, stream, failure).strip(), indent(self.code.strip()), result) + + return data + def generate(self, result, stream, failure): data = """ %s @@ -202,6 +265,22 @@ Pattern.__init__(self) self.next = next + def generate_python(self, result, stream, failure): + my_fail = lambda : "raise PegError" + my_result = newResult() + data = """ +try: + while True: + %s = Result(%s.getPosition()); + %s + %s.addResult(%s); +except PegError: + pass + """ % (my_result, result, indent(indent(self.next.generate_python(my_result, stream, my_fail).strip())), result, my_result) + + return data + + def generate(self, result, stream, failure): loop_done = "loop_%d" % nextVar() my_fail = lambda : "goto %s;" % loop_done @@ -247,6 +326,17 @@ Pattern.__init__(self) self.letters = letters + def generate_python(self, result, stream, failure): + data = """ +for letter in '%s': + if letter == %s.get(%s.getPosition()): + %s.nextPosition() + else: + %s +""" % (self.letters, stream, result, result, failure()) + return data + + def generate(self, result, stream, failure): data = """ %s = "%s"; @@ -283,6 +373,33 @@ self.name = name self.patterns = patterns + def generate_python(self): + def newPattern(pattern, stream, position): + result = newResult() + + def fail(): + return "raise PegError" + data = """ +try: + %s = Result(%s) + %s + %s.update(%s) + return %s +except PegError: + pass + """ % (result, position, indent(pattern.generate_python(result, stream, fail).strip()), stream, result, result) + return data + + stream = "stream" + position = "position" + data = """ +def rule_%s(%s, %s): + %s + return None +""" % (self.name, stream, position, indent('\n'.join([newPattern(pattern, stream, position).strip() for pattern in self.patterns]))) + + return data + def generate(self): def newPattern(pattern, stream, position): result = newResult() @@ -318,6 +435,23 @@ self.start = start self.rules = rules + def generate_python(self): + data = """ +import peg + +%s + +def parse(file): + stream = Stream(file) + done = rule_%s(stream, 0) + if (done.error()): + print "Error parsing " + file + else: + return done.getValues() +""" % ('\n'.join([rule.generate_python() for rule in self.rules]), self.start) + + return data + def generate(self): def prototype(rule): return "Result rule_%s(Stream &, const int);" % rule.name @@ -367,6 +501,12 @@ peg = Peg("Peg", "s", rules) generate(peg) +def create_peg(name, peg): + import imp + module = imp.new_module(name) + exec peg.generate_python() in module.__dict__ + return module.parse + def test2(): start_code_abc = """ std::cout << "Parsed abc!" << std::endl; @@ -391,5 +531,26 @@ peg = Peg("Peg", "start", rules) generate(peg) +def make_peg_parser(): + start_code_abc = """ +print "parsed abc" +""" + s_code = """ +print "s code" +""" + rules = [ + Rule("start", [ + PatternAction(PatternSequence([PatternRule("a"),PatternRule("b"), PatternRule("c")]), start_code_abc), + ]), + Rule("s", [ + PatternNot(PatternVerbatim("hello")), PatternAction(PatternVerbatim("cheese"), s_code), + PatternRepeatOnce(PatternVerbatim("once"))]), + Rule("blah", [PatternRepeatMany(PatternRule("s"))]), + ] + peg = Peg("*peg*", "start", rules) + print peg.generate_python() + # test() -test2() +# test2() + +make_peg_parser() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 00:07:19
|
Revision: 2264 http://paintown.svn.sourceforge.net/paintown/?rev=2264&view=rev Author: kazzmir Date: 2009-07-28 00:07:11 +0000 (Tue, 28 Jul 2009) Log Message: ----------- generate python parser in python Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-27 23:39:04 UTC (rev 2263) +++ trunk/src/mugen/parser/peg.py 2009-07-28 00:07:11 UTC (rev 2264) @@ -98,6 +98,56 @@ Result errorResult(-1); """ +start_python = """ +class PegError(Exception): + def __init__(self): + Exception.__init__(self) + +class Result: + def __init__(self, position): + self.position = position + self.values = [] + + def getPosition(self): + return self.position + + def nextPosition(self): + self.position += 1 + + def setValue(self, value): + self.values = [value] + + def matches(self): + return len(self.values) + + def getValues(self): + return self.values + + def addResult(self, him): + self.values.extend(him.values) + self.position = him.position + +class Stream: + def __init__(self, filename): + self.file = open(filename, 'r') + + def close(self): + self.file.close() + + def get(self, position): + self.file.seek(position) + return self.file.read(1) + + def update(self, result): + pass + + def hasResult(self, position): + return false + + def result(self, position): + return Result(-1) +""" + class Pattern: def __init__(self): pass @@ -441,14 +491,19 @@ %s +%s + def parse(file): + # print "Parsing " + file stream = Stream(file) done = rule_%s(stream, 0) - if (done.error()): + stream.close() + if done == None: print "Error parsing " + file + return [] else: return done.getValues() -""" % ('\n'.join([rule.generate_python() for rule in self.rules]), self.start) +""" % (start_python, '\n'.join([rule.generate_python() for rule in self.rules]), self.start) return data @@ -501,10 +556,19 @@ peg = Peg("Peg", "s", rules) generate(peg) -def create_peg(name, peg): - import imp - module = imp.new_module(name) - exec peg.generate_python() in module.__dict__ +def create_peg(peg): + # import imp + # module = imp.new_module(peg.namespace) + # exec peg.generate_python() in module.__dict__ + # return module.parse + + name = "peg_" + peg.namespace + out = open(name + ".py", 'w') + out.write(peg.generate_python()) + out.close() + module = __import__(name, globals(), locals(), ['parse']) + # print module + # print dir(module) return module.parse def test2(): @@ -542,15 +606,26 @@ Rule("start", [ PatternAction(PatternSequence([PatternRule("a"),PatternRule("b"), PatternRule("c")]), start_code_abc), ]), + Rule("a", [PatternVerbatim("a")]), + Rule("b", [PatternVerbatim("b")]), + Rule("c", [PatternVerbatim("c")]), + Rule("s", [ PatternNot(PatternVerbatim("hello")), PatternAction(PatternVerbatim("cheese"), s_code), PatternRepeatOnce(PatternVerbatim("once"))]), Rule("blah", [PatternRepeatMany(PatternRule("s"))]), ] - peg = Peg("*peg*", "start", rules) - print peg.generate_python() + peg = Peg("peg", "start", rules) + # print peg.generate_python() + parser = create_peg(peg) + # print parser + print "Got " + str(parser('peg.in')) + # module = compile(peg.generate_python(), peg.namespace, 'exec') + # print module # test() # test2() -make_peg_parser() +# make_peg_parser() +if __name__ == '__main__': + make_peg_parser() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 00:47:24
|
Revision: 2265 http://paintown.svn.sourceforge.net/paintown/?rev=2265&view=rev Author: kazzmir Date: 2009-07-28 00:47:12 +0000 (Tue, 28 Jul 2009) Log Message: ----------- start to parse peg definition Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 00:07:11 UTC (rev 2264) +++ trunk/src/mugen/parser/peg.py 2009-07-28 00:47:12 UTC (rev 2265) @@ -194,10 +194,11 @@ def generate_python(self, result, stream, failure): data = """ +print "Trying rule " + '%s' %s = rule_%s(%s, %s.getPosition()) if %s == None: %s -""" % (result, self.rule, stream, result, result, failure()) +""" % (self.rule, result, self.rule, stream, result, result, failure()) return data @@ -271,7 +272,7 @@ do{ Result %s(%s.getPosition()); %s - %s.addResult(%s); + %s.extendResult(%s); } while (true); %s: if (%s.matches() == 0){ @@ -292,9 +293,10 @@ %s if True: value = None + values = %s.getValues() %s %s.setValue(value) -""" % (self.before.generate_python(result, stream, failure).strip(), indent(self.code.strip()), result) +""" % (self.before.generate_python(result, stream, failure).strip(), result, indent(self.code.strip()), result) return data @@ -383,7 +385,8 @@ %s.nextPosition() else: %s -""" % (self.letters, stream, result, result, failure()) +%s.setValue('%s') +""" % (self.letters, stream, result, result, failure(), result, self.letters) return data @@ -615,6 +618,25 @@ PatternRepeatOnce(PatternVerbatim("once"))]), Rule("blah", [PatternRepeatMany(PatternRule("s"))]), ] + + rules = [ + Rule("start", [ + PatternAction(PatternSequence([PatternRule("start_symbol"), PatternRule("newlines")]), "value = values[0]") + ]), + Rule("word", [ + PatternAction(PatternRepeatOnce(PatternRule("any_char")), """ +print "all start symbol values " + str(values) +value = ''.join(values) +""") + ]), + Rule("start_symbol", [ + PatternAction(PatternSequence([PatternVerbatim("start-symbol:"), PatternRepeatMany(PatternRule("space")), PatternRule("word")]), "value = values[2]; print 'start symbol is ' + str(value);") + ]), + Rule("space", [PatternVerbatim(" ")]), + Rule("any_char", [PatternVerbatim(letter) for letter in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ']), + Rule("newlines", [PatternRepeatMany(PatternVerbatim("\\n"))]), + ] + peg = Peg("peg", "start", rules) # print peg.generate_python() parser = create_peg(peg) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 03:56:39
|
Revision: 2266 http://paintown.svn.sourceforge.net/paintown/?rev=2266&view=rev Author: kazzmir Date: 2009-07-28 03:56:32 +0000 (Tue, 28 Jul 2009) Log Message: ----------- fix lists Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 00:47:12 UTC (rev 2265) +++ trunk/src/mugen/parser/peg.py 2009-07-28 03:56:32 UTC (rev 2266) @@ -115,7 +115,7 @@ self.position += 1 def setValue(self, value): - self.values = [value] + self.values = value def matches(self): return len(self.values) @@ -124,6 +124,10 @@ return self.values def addResult(self, him): + self.values.append(him.values) + self.position = him.position + + def extendResult(self, him): self.values.extend(him.values) self.position = him.position @@ -248,9 +252,9 @@ self.next = next def generate_python(self, result, stream, failure): - loop_done = "loop_%d" % nextVar() my_fail = lambda : "raise PegError" my_result = newResult() + my_result2 = newResult() data = """ try: while True: @@ -264,6 +268,7 @@ return data + def generate(self, result, stream, failure): loop_done = "loop_%d" % nextVar() my_fail = lambda : "goto %s;" % loop_done @@ -272,7 +277,7 @@ do{ Result %s(%s.getPosition()); %s - %s.extendResult(%s); + %s.addResult(%s); } while (true); %s: if (%s.matches() == 0){ @@ -333,6 +338,7 @@ return data + def generate(self, result, stream, failure): loop_done = "loop_%d" % nextVar() my_fail = lambda : "goto %s;" % loop_done @@ -621,18 +627,72 @@ rules = [ Rule("start", [ - PatternAction(PatternSequence([PatternRule("start_symbol"), PatternRule("newlines")]), "value = values[0]") + PatternAction(PatternSequence([PatternRule("start_symbol"), PatternRule("newlines"), PatternRule("rules")]), """ +start_symbol = values[0] +rules = values[2] +value = rules +""") ]), Rule("word", [ PatternAction(PatternRepeatOnce(PatternRule("any_char")), """ print "all start symbol values " + str(values) +# print "values[0] " + str(values[0]) value = ''.join(values) +print "got word " + value """) ]), + Rule("rules", [ + PatternAction( + PatternSequence([ + PatternVerbatim("rules:"), + PatternRule("newlines"), + PatternRepeatMany(PatternRule("rule")) + ]), + """value = values[2]""") + ]), + Rule("rule", [ + PatternAction(PatternSequence([ + PatternRule("spaces"), + PatternRule("word"), + PatternRule("spaces"), + PatternVerbatim("="), + PatternRule("spaces"), + PatternRepeatMany(PatternRule("pattern")), + PatternRule("newlines"), + PatternRepeatMany(PatternAction(PatternSequence([ + PatternRule("spaces"), + PatternVerbatim("|"), + PatternRule("spaces"), + PatternRepeatMany(PatternRule("pattern")), + PatternRule("newlines")]), + """ +value = values[3] +""" + ))]), + """ +name = values[1] +pattern1 = values[5] +patterns = values[7] +print "pattern name is " + str(name) +print "first pattern is " + str(pattern1) +print "other patterns are " + str(patterns) +value = [pattern1] + patterns +""") + ]), + Rule("pattern", [ + PatternAction(PatternSequence([ + PatternRule("word"), + PatternRule("spaces")]), + """ +value = values[0] +print "Pattern is " + str(value) +""") + ]), Rule("start_symbol", [ PatternAction(PatternSequence([PatternVerbatim("start-symbol:"), PatternRepeatMany(PatternRule("space")), PatternRule("word")]), "value = values[2]; print 'start symbol is ' + str(value);") ]), - Rule("space", [PatternVerbatim(" ")]), + Rule("spaces", [PatternRepeatMany(PatternRule("space"))]), + Rule("space", [PatternVerbatim(" "), PatternVerbatim("\\t")]), Rule("any_char", [PatternVerbatim(letter) for letter in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ']), Rule("newlines", [PatternRepeatMany(PatternVerbatim("\\n"))]), ] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 06:14:42
|
Revision: 2269 http://paintown.svn.sourceforge.net/paintown/?rev=2269&view=rev Author: kazzmir Date: 2009-07-28 05:59:24 +0000 (Tue, 28 Jul 2009) Log Message: ----------- handle modifiers and sub-patterns Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 05:37:33 UTC (rev 2268) +++ trunk/src/mugen/parser/peg.py 2009-07-28 05:59:24 UTC (rev 2269) @@ -3,10 +3,11 @@ # Packrat PEG (parsing expression grammar) generator # http://pdos.csail.mit.edu/~baford/packrat/ -# Python parser: +# Python BNF parser: # 1. 171397b / 45.216s = 3790.62721160651 b/s # 2. 171397b / 36.751s = 4663.73704116895 b/s # 3. 171397b / 8.630s = 19860.6025492468 b/s +# 4. 171397b / 10.539s = 16263.1179428788 b/s next_var = 0 def nextVar(): @@ -376,6 +377,22 @@ """ % (my_result, result, indent(self.next.generate(my_result, stream, my_fail).strip()), result, my_result, loop_done) return data +class PatternMaybe(Pattern): + def __init__(self, pattern): + Pattern.__init__(self) + self.pattern = pattern + + def generate_python(self, result, stream, failure): + save = "save_%d" % nextVar() + data = """ +%s = %s.getPosition() +%s +if %s == None: + %s = Result(%s) + %s.setValue(None) +""" % (save, result, self.pattern.generate_python(result, stream, lambda : "pass"), result, result, save, result) + return data + class PatternOr(Pattern): def __init__(self, patterns): Pattern.__init__(self) @@ -750,14 +767,28 @@ PatternAction(PatternSequence([ PatternOr([ PatternRule("x_word"), - PatternRule("string"),]), + PatternRule("string"), + PatternRule("sub_pattern")]), + PatternMaybe(PatternRule("modifier")), PatternRule("spaces")]), """ # value = peg.PatternRule(values[0]) +modifier = values[1] value = values[0] +if modifier != None: + value = modifier(value) # print "Pattern is " + str(value) """) ]), + Rule("sub_pattern", [ + PatternAction(PatternSequence([ + PatternVerbatim("("), + PatternRepeatOnce(PatternRule("pattern")), + PatternVerbatim(")"), + ]),""" +value = peg.PatternSequence(values[1]) +"""), + ]), Rule("string", [ PatternAction(PatternSequence([ PatternVerbatim("\""), @@ -767,6 +798,17 @@ value = peg.PatternVerbatim(values[1]) """), ]), + Rule("modifier", [ + PatternAction(PatternVerbatim("*"),""" +value = lambda p: peg.PatternRepeatMany(p) +"""), + PatternAction(PatternVerbatim("?"),""" +value = lambda p: peg.PatternMaybe(p) +"""), + PatternAction(PatternVerbatim("+"),""" +value = lambda p: peg.PatternRepeatOnce(p) +"""), + ]), Rule("x_word", [ PatternAction(PatternRule("word"), """ value = peg.PatternRule(values[0]) @@ -806,4 +848,4 @@ parser = make_peg_parser() if len(sys.argv) > 1: out = parser(sys.argv[1]) - print out.generate_python() + # print out.generate() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 16:41:44
|
Revision: 2270 http://paintown.svn.sourceforge.net/paintown/?rev=2270&view=rev Author: kazzmir Date: 2009-07-28 16:41:36 +0000 (Tue, 28 Jul 2009) Log Message: ----------- add variable binding pattern Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 05:59:24 UTC (rev 2269) +++ trunk/src/mugen/parser/peg.py 2009-07-28 16:41:36 UTC (rev 2270) @@ -433,6 +433,19 @@ data += "%s:\n" % success return data +class PatternBind(Pattern): + def __init__(self, variable, pattern): + Pattern.__init__(self) + self.variable = variable + self.pattern = pattern + + def generate_python(self, result, stream, failure): + data = """ +%s +%s = %s.getValues() +""" % (self.pattern.generate_python(result, stream, failure).strip(), self.variable, result) + return data + class PatternRange(Pattern): def __init__(self, range): Pattern.__init__(self) @@ -737,26 +750,28 @@ Rule("rule", [ PatternAction(PatternSequence([ PatternRule("spaces"), - PatternRule("word"), + PatternBind("name", PatternRule("word")), PatternRule("spaces"), PatternVerbatim("="), PatternRule("spaces"), - PatternRepeatMany(PatternRule("pattern")), + PatternBind("pattern1", PatternRepeatMany(PatternRule("pattern"))), PatternRule("newlines"), - PatternRepeatMany(PatternAction(PatternSequence([ - PatternRule("spaces"), - PatternVerbatim("|"), - PatternRule("spaces"), - PatternRepeatMany(PatternRule("pattern")), - PatternRule("newlines")]), - """ -value = values[3] + PatternBind("patterns", + PatternRepeatMany(PatternAction(PatternSequence([ + PatternRule("spaces"), + PatternVerbatim("|"), + PatternRule("spaces"), + PatternBind("pattern", PatternRepeatMany(PatternRule("pattern"))), + PatternRule("newlines")]), + """ +# value = values[3] +value = pattern """ - ))]), +)))]), """ -name = values[1] -pattern1 = values[5] -patterns = values[7] +# name = values[1] +# pattern1 = values[5] +# patterns = values[7] #print "pattern name is " + str(name) #print "first pattern is " + str(pattern1) #print "other patterns are " + str(patterns) @@ -846,6 +861,7 @@ if __name__ == '__main__': import sys parser = make_peg_parser() + # out = parser('peg.in.x') if len(sys.argv) > 1: out = parser(sys.argv[1]) - # print out.generate() + print out.generate() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 17:01:16
|
Revision: 2271 http://paintown.svn.sourceforge.net/paintown/?rev=2271&view=rev Author: kazzmir Date: 2009-07-28 17:01:04 +0000 (Tue, 28 Jul 2009) Log Message: ----------- add binders to pattern language. match eof Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 16:41:36 UTC (rev 2270) +++ trunk/src/mugen/parser/peg.py 2009-07-28 17:01:04 UTC (rev 2271) @@ -240,6 +240,20 @@ return data +class PatternEof(Pattern): + def __init__(self): + Pattern.__init__(self) + + def generate_python(self, result, stream, failure): + data = """ +if chr(0) == %s.get(%s.getPosition()): + %s.nextPosition() + %s.setValue(chr(0)) +else: + %s +""" % (stream, result, result, result, failure()) + return data + class PatternSequence(Pattern): def __init__(self, patterns): Pattern.__init__(self) @@ -724,7 +738,13 @@ rules = [ Rule("start", [ - PatternAction(PatternSequence([PatternRule("start_symbol"), PatternRule("newlines"), PatternRule("rules")]), """ + PatternAction(PatternSequence([ + PatternRule("start_symbol"), + PatternRule("newlines"), + PatternRule("rules"), + PatternRule("newlines"), + PatternEof(), + ]), """ start_symbol = values[0] rules = values[2] value = peg.Peg('xx', start_symbol, rules) @@ -781,6 +801,7 @@ Rule("pattern", [ PatternAction(PatternSequence([ PatternOr([ + PatternRule("bind"), PatternRule("x_word"), PatternRule("string"), PatternRule("sub_pattern")]), @@ -804,6 +825,15 @@ value = peg.PatternSequence(values[1]) """), ]), + Rule("bind", [ + PatternAction(PatternSequence([ + PatternBind("name", PatternRule("word")), + PatternVerbatim(":"), + PatternBind("pattern", PatternRule("pattern")) + ]),""" +value = peg.PatternBind(name, pattern) +"""), + ]), Rule("string", [ PatternAction(PatternSequence([ PatternVerbatim("\""), @@ -826,7 +856,7 @@ ]), Rule("x_word", [ PatternAction(PatternRule("word"), """ -value = peg.PatternRule(values[0]) +value = peg.PatternRule(values) """), ]), Rule("start_symbol", [ @@ -864,4 +894,5 @@ # out = parser('peg.in.x') if len(sys.argv) > 1: out = parser(sys.argv[1]) - print out.generate() + print out + print out.generate_python() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 21:12:12
|
Revision: 2272 http://paintown.svn.sourceforge.net/paintown/?rev=2272&view=rev Author: kazzmir Date: 2009-07-28 21:11:53 +0000 (Tue, 28 Jul 2009) Log Message: ----------- generate bnf from pattern language Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 17:01:04 UTC (rev 2271) +++ trunk/src/mugen/parser/peg.py 2009-07-28 21:11:53 UTC (rev 2272) @@ -220,6 +220,9 @@ Pattern.__init__(self) self.rule = rule + def generate_bnf(self): + return self.rule + def generate_python(self, result, stream, failure): data = """ # print "Trying rule " + '%s' @@ -259,6 +262,9 @@ Pattern.__init__(self) self.patterns = patterns + def generate_bnf(self): + return "(%s)" % " ".join([p.generate_bnf() for p in self.patterns]) + def generate_python(self, result, stream, failure): data = "" for pattern in self.patterns: @@ -289,6 +295,9 @@ Pattern.__init__(self) self.next = next + def generate_bnf(self): + return self.next.generate_bnf() + "+" + def generate_python(self, result, stream, failure): my_fail = lambda : "raise PegError" my_result = newResult() @@ -360,6 +369,9 @@ Pattern.__init__(self) self.next = next + def generate_bnf(self): + return self.next.generate_bnf() + "*" + def generate_python(self, result, stream, failure): my_fail = lambda : "raise PegError" my_result = newResult() @@ -453,6 +465,9 @@ self.variable = variable self.pattern = pattern + def generate_bnf(self): + return "%s:%s" % (self.variable, self.pattern.generate_bnf()) + def generate_python(self, result, stream, failure): data = """ %s @@ -483,6 +498,9 @@ Pattern.__init__(self) self.letters = letters + def generate_bnf(self): + return '"%s"' % self.letters + def generate_python2(self, result, stream, failure): data = """ for letter in '%s': @@ -543,6 +561,12 @@ self.name = name self.patterns = patterns + def generate_bnf(self): + data = """ +%s = %s +""" % (self.name, (('\n%s | ') % (' ' * len(self.name))).join([p.generate_bnf() for p in self.patterns])) + return data + def generate_python(self): def newPattern(pattern, stream, position): result = newResult() @@ -627,6 +651,14 @@ return data + def generate_bnf(self): + data = """ +start-symbol: %s +rules: + %s +""" % (self.start, indent('\n'.join([rule.generate_bnf() for rule in self.rules]).strip())) + return data + def generate(self): def prototype(rule): return "Result rule_%s(Stream &, const int);" % rule.name @@ -796,23 +828,27 @@ #print "first pattern is " + str(pattern1) #print "other patterns are " + str(patterns) value = peg.Rule(name, [peg.PatternSequence(pattern) for pattern in ([pattern1] + patterns)]) +# print "Patterns are " + str([pattern1] + patterns) +# value = peg.Rule(name, [pattern1] + patterns) """) ]), Rule("pattern", [ PatternAction(PatternSequence([ - PatternOr([ - PatternRule("bind"), - PatternRule("x_word"), - PatternRule("string"), - PatternRule("sub_pattern")]), - PatternMaybe(PatternRule("modifier")), + PatternBind("bind", PatternMaybe(PatternRule("bind"))), + PatternBind("pattern", + PatternOr([ + PatternRule("x_word"), + PatternRule("string"), + PatternRule("sub_pattern")])), + PatternBind("modifier", PatternMaybe(PatternRule("modifier"))), PatternRule("spaces")]), """ # value = peg.PatternRule(values[0]) -modifier = values[1] -value = values[0] if modifier != None: - value = modifier(value) + pattern = modifier(pattern) +if bind != None: + pattern = bind(pattern) +value = pattern # print "Pattern is " + str(value) """) ]), @@ -829,9 +865,8 @@ PatternAction(PatternSequence([ PatternBind("name", PatternRule("word")), PatternVerbatim(":"), - PatternBind("pattern", PatternRule("pattern")) ]),""" -value = peg.PatternBind(name, pattern) +value = lambda p: peg.PatternBind(name, p) """), ]), Rule("string", [ @@ -895,4 +930,4 @@ if len(sys.argv) > 1: out = parser(sys.argv[1]) print out - print out.generate_python() + print out.generate_bnf() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 21:34:09
|
Revision: 2273 http://paintown.svn.sourceforge.net/paintown/?rev=2273&view=rev Author: kazzmir Date: 2009-07-28 21:34:00 +0000 (Tue, 28 Jul 2009) Log Message: ----------- add ! modifier. fix indentation Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 21:11:53 UTC (rev 2272) +++ trunk/src/mugen/parser/peg.py 2009-07-28 21:34:00 UTC (rev 2273) @@ -188,6 +188,9 @@ Pattern.__init__(self) self.next = next + def generate_bnf(self): + return "!" + self.next.generate_bnf() + def generate_python(self, result, stream, failure): my_result = newResult() my_fail = lambda : "raise PegError" @@ -229,7 +232,7 @@ %s = rule_%s(%s, %s.getPosition()) if %s == None: %s -""" % (self.rule, result, self.rule, stream, result, result, failure()) +""" % (self.rule, result, self.rule, stream, result, result, indent(failure())) return data @@ -410,13 +413,15 @@ def generate_python(self, result, stream, failure): save = "save_%d" % nextVar() + fail = lambda : """ +%s = Result(%s) +%s.setValue(None) +""" % (result, save, result) + data = """ %s = %s.getPosition() %s -if %s == None: - %s = Result(%s) - %s.setValue(None) -""" % (save, result, self.pattern.generate_python(result, stream, lambda : "pass"), result, result, save, result) +""" % (save, result, self.pattern.generate_python(result, stream, fail)) return data class PatternOr(Pattern): @@ -435,7 +440,7 @@ if %s != None: %s = %s """ % (my_result, result, pattern.generate_python(my_result, stream, fail).strip(), my_result, result, my_result) - fail = lambda : indent(data) + fail = lambda : data return data def generate(self, result, stream, failure): @@ -519,10 +524,10 @@ data = """ if '%s' == %s.get(%s.getPosition(), %s): %s.nextPosition(%s) + %s.setValue('%s') else: %s -%s.setValue('%s') -""" % (self.letters, stream, result, length, result, length, failure(), result, self.letters) +""" % (self.letters, stream, result, length, result, length, result, self.letters, indent(failure())) return data def generate(self, result, stream, failure): @@ -835,22 +840,31 @@ Rule("pattern", [ PatternAction(PatternSequence([ PatternBind("bind", PatternMaybe(PatternRule("bind"))), + PatternBind("item", PatternRule("item")), + PatternRule("spaces")]), + """ +# value = peg.PatternRule(values[0]) +if bind != None: + item = bind(item) +value = item +# print "Pattern is " + str(value) +""") + ]), + Rule("item", [ + PatternAction(PatternSequence([ + PatternBind("pnot", PatternMaybe(PatternVerbatim("!"))), PatternBind("pattern", PatternOr([ PatternRule("x_word"), PatternRule("string"), PatternRule("sub_pattern")])), - PatternBind("modifier", PatternMaybe(PatternRule("modifier"))), - PatternRule("spaces")]), - """ -# value = peg.PatternRule(values[0]) + PatternBind("modifier", PatternMaybe(PatternRule("modifier")))]), """ if modifier != None: pattern = modifier(pattern) -if bind != None: - pattern = bind(pattern) +if pnot != None: + pattern = peg.PatternNot(pattern) value = pattern -# print "Pattern is " + str(value) -""") +"""), ]), Rule("sub_pattern", [ PatternAction(PatternSequence([ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 22:01:55
|
Revision: 2274 http://paintown.svn.sourceforge.net/paintown/?rev=2274&view=rev Author: kazzmir Date: 2009-07-28 22:01:47 +0000 (Tue, 28 Jul 2009) Log Message: ----------- fix not. support semantic actions Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 21:34:00 UTC (rev 2273) +++ trunk/src/mugen/parser/peg.py 2009-07-28 22:01:47 UTC (rev 2274) @@ -109,6 +109,10 @@ def __init__(self): Exception.__init__(self) +class NotError(Exception): + def __init__(self): + Exception.__init__(self) + class Result: def __init__(self, position): self.position = position @@ -193,14 +197,15 @@ def generate_python(self, result, stream, failure): my_result = newResult() - my_fail = lambda : "raise PegError" + my_fail = lambda : "raise NotError" data = """ -%s = Result(%s); +%s = Result(%s.getPosition()); try: %s -except PegError: %s - """ % (my_result, result, indent(self.next.generate_python(my_result, stream, my_fail).strip()), failure()) +except NotError: + %s.setValue(None) + """ % (my_result, result, indent(self.next.generate_python(my_result, stream, my_fail).strip()), failure(), result) return data @@ -343,6 +348,13 @@ self.before = before self.code = code + def generate_bnf(self): + data = """%s { + %s +} +""" % (self.before.generate_bnf(), self.code) + return data + def generate_python(self, result, stream, failure): data = """ %s @@ -406,6 +418,17 @@ """ % (my_result, result, indent(self.next.generate(my_result, stream, my_fail).strip()), result, my_result, loop_done) return data +class PatternAny(Pattern): + def __init__(self): + Pattern.__init__(self) + + def generate_python(self, result, stream, failure): + data = """ +%s.setValue(%s.get(%s.getPosition())) +%s.nextPosition() +""" % (result, stream, result, result) + return data + class PatternMaybe(Pattern): def __init__(self, pattern): Pattern.__init__(self) @@ -841,15 +864,34 @@ PatternAction(PatternSequence([ PatternBind("bind", PatternMaybe(PatternRule("bind"))), PatternBind("item", PatternRule("item")), - PatternRule("spaces")]), + PatternRule("spaces"), + PatternBind("code", PatternMaybe(PatternRule("code"))), + PatternRule("spaces"),]), """ # value = peg.PatternRule(values[0]) if bind != None: item = bind(item) +if code != None: + item = code(item) value = item # print "Pattern is " + str(value) """) ]), + Rule("code", [ + PatternAction(PatternSequence([ + PatternVerbatim("{"), + PatternRepeatOnce(PatternAction(PatternSequence([ + PatternNot(PatternVerbatim("}")), + PatternAny(), + ]), + """ +value = values[1] +""")), + PatternVerbatim("}"), + ]), """ +value = lambda p: peg.PatternAction(p, ''.join(values[1])) +"""), + ]), Rule("item", [ PatternAction(PatternSequence([ PatternBind("pnot", PatternMaybe(PatternVerbatim("!"))), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 22:04:25
|
Revision: 2275 http://paintown.svn.sourceforge.net/paintown/?rev=2275&view=rev Author: kazzmir Date: 2009-07-28 22:04:02 +0000 (Tue, 28 Jul 2009) Log Message: ----------- use {{ so that C code does not confuse us Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 22:01:47 UTC (rev 2274) +++ trunk/src/mugen/parser/peg.py 2009-07-28 22:04:02 UTC (rev 2275) @@ -349,9 +349,9 @@ self.code = code def generate_bnf(self): - data = """%s { + data = """%s {{ %s -} +}} """ % (self.before.generate_bnf(), self.code) return data @@ -879,15 +879,15 @@ ]), Rule("code", [ PatternAction(PatternSequence([ - PatternVerbatim("{"), + PatternVerbatim("{{"), PatternRepeatOnce(PatternAction(PatternSequence([ - PatternNot(PatternVerbatim("}")), + PatternNot(PatternVerbatim("}}")), PatternAny(), ]), """ value = values[1] """)), - PatternVerbatim("}"), + PatternVerbatim("}}"), ]), """ value = lambda p: peg.PatternAction(p, ''.join(values[1])) """), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 22:10:45
|
Revision: 2276 http://paintown.svn.sourceforge.net/paintown/?rev=2276&view=rev Author: kazzmir Date: 2009-07-28 22:10:17 +0000 (Tue, 28 Jul 2009) Log Message: ----------- support parens on * and ? Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 22:04:02 UTC (rev 2275) +++ trunk/src/mugen/parser/peg.py 2009-07-28 22:10:17 UTC (rev 2276) @@ -187,6 +187,12 @@ def generate(self, result, stream, failure): pass + def parens(self, pattern, str): + if pattern.contains() > 1: + return "(%s)" % str + else: + return str + class PatternNot(Pattern): def __init__(self, next): Pattern.__init__(self) @@ -228,6 +234,9 @@ Pattern.__init__(self) self.rule = rule + def contains(self): + return 1 + def generate_bnf(self): return self.rule @@ -270,8 +279,11 @@ Pattern.__init__(self) self.patterns = patterns + def contains(self): + return len(self.patterns) + def generate_bnf(self): - return "(%s)" % " ".join([p.generate_bnf() for p in self.patterns]) + return "%s" % " ".join([p.generate_bnf() for p in self.patterns]) def generate_python(self, result, stream, failure): data = "" @@ -304,7 +316,7 @@ self.next = next def generate_bnf(self): - return self.next.generate_bnf() + "+" + return self.parens(self.next, self.next.generate_bnf()) + "+" def generate_python(self, result, stream, failure): my_fail = lambda : "raise PegError" @@ -385,7 +397,7 @@ self.next = next def generate_bnf(self): - return self.next.generate_bnf() + "*" + return self.parens(self.next, self.next.generate_bnf()) + "*" def generate_python(self, result, stream, failure): my_fail = lambda : "raise PegError" @@ -434,6 +446,9 @@ Pattern.__init__(self) self.pattern = pattern + def generate_bnf(self): + return self.parens(self.pattern, self.pattern.generate_bnf()) + "?" + def generate_python(self, result, stream, failure): save = "save_%d" % nextVar() fail = lambda : """ @@ -526,6 +541,9 @@ Pattern.__init__(self) self.letters = letters + def contains(self): + return 1 + def generate_bnf(self): return '"%s"' % self.letters This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 22:16:03
|
Revision: 2277 http://paintown.svn.sourceforge.net/paintown/?rev=2277&view=rev Author: kazzmir Date: 2009-07-28 22:15:41 +0000 (Tue, 28 Jul 2009) Log Message: ----------- remove extra newline Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 22:10:17 UTC (rev 2276) +++ trunk/src/mugen/parser/peg.py 2009-07-28 22:15:41 UTC (rev 2277) @@ -363,8 +363,7 @@ def generate_bnf(self): data = """%s {{ %s -}} -""" % (self.before.generate_bnf(), self.code) +}}""" % (self.before.generate_bnf(), self.code) return data def generate_python(self, result, stream, failure): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-28 22:23:28
|
Revision: 2278 http://paintown.svn.sourceforge.net/paintown/?rev=2278&view=rev Author: kazzmir Date: 2009-07-28 22:23:19 +0000 (Tue, 28 Jul 2009) Log Message: ----------- check for missing rules Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 22:15:41 UTC (rev 2277) +++ trunk/src/mugen/parser/peg.py 2009-07-28 22:23:19 UTC (rev 2278) @@ -198,6 +198,9 @@ Pattern.__init__(self) self.next = next + def ensureRules(self, find): + self.next.ensureRules(find) + def generate_bnf(self): return "!" + self.next.generate_bnf() @@ -237,6 +240,10 @@ def contains(self): return 1 + def ensureRules(self, find): + if not find(self.rule): + print "*warning* could not find rule " + self.rule + def generate_bnf(self): return self.rule @@ -264,6 +271,9 @@ def __init__(self): Pattern.__init__(self) + def ensureRules(self, find): + pass + def generate_python(self, result, stream, failure): data = """ if chr(0) == %s.get(%s.getPosition()): @@ -282,6 +292,10 @@ def contains(self): return len(self.patterns) + def ensureRules(self, find): + for pattern in self.patterns: + pattern.ensureRules(find) + def generate_bnf(self): return "%s" % " ".join([p.generate_bnf() for p in self.patterns]) @@ -315,6 +329,9 @@ Pattern.__init__(self) self.next = next + def ensureRules(self, find): + self.next.ensureRules(find) + def generate_bnf(self): return self.parens(self.next, self.next.generate_bnf()) + "+" @@ -360,6 +377,9 @@ self.before = before self.code = code + def ensureRules(self, find): + self.before.ensureRules(find) + def generate_bnf(self): data = """%s {{ %s @@ -395,6 +415,9 @@ Pattern.__init__(self) self.next = next + def ensureRules(self, find): + self.next.ensureRules(find) + def generate_bnf(self): return self.parens(self.next, self.next.generate_bnf()) + "*" @@ -433,6 +456,9 @@ def __init__(self): Pattern.__init__(self) + def ensureRules(self, find): + pass + def generate_python(self, result, stream, failure): data = """ %s.setValue(%s.get(%s.getPosition())) @@ -445,6 +471,9 @@ Pattern.__init__(self) self.pattern = pattern + def ensureRules(self, find): + self.pattern.ensureRules(find) + def generate_bnf(self): return self.parens(self.pattern, self.pattern.generate_bnf()) + "?" @@ -466,6 +495,10 @@ Pattern.__init__(self) self.patterns = patterns + def ensureRules(self, find): + for pattern in self.patterns: + pattern.ensureRules(find) + def generate_python(self, result, stream, failure): data = "" fail = failure @@ -507,6 +540,9 @@ self.variable = variable self.pattern = pattern + def ensureRules(self, find): + self.pattern.ensureRules(find) + def generate_bnf(self): return "%s:%s" % (self.variable, self.pattern.generate_bnf()) @@ -522,6 +558,9 @@ Pattern.__init__(self) self.range = range + def ensureRules(self, find): + pass + def generate_python(self, result, stream, failure): letter = "letter_%d" % nextVar() data = """ @@ -540,6 +579,9 @@ Pattern.__init__(self) self.letters = letters + def ensureRules(self, find): + pass + def contains(self): return 1 @@ -612,6 +654,10 @@ """ % (self.name, (('\n%s | ') % (' ' * len(self.name))).join([p.generate_bnf() for p in self.patterns])) return data + def ensureRules(self, find): + for pattern in self.patterns: + pattern.ensureRules(find) + def generate_python(self): def newPattern(pattern, stream, position): result = newResult() @@ -674,6 +720,9 @@ self.start = start self.rules = rules + for rule in self.rules: + rule.ensureRules(lambda r: r in [r2.name for r2 in self.rules]) + def generate_python(self): data = """ import peg This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ka...@us...> - 2009-07-29 05:23:28
|
Revision: 2279 http://paintown.svn.sourceforge.net/paintown/?rev=2279&view=rev Author: kazzmir Date: 2009-07-29 05:23:17 +0000 (Wed, 29 Jul 2009) Log Message: ----------- rename generate to generate_cpp Modified Paths: -------------- trunk/src/mugen/parser/peg.py Modified: trunk/src/mugen/parser/peg.py =================================================================== --- trunk/src/mugen/parser/peg.py 2009-07-28 22:23:19 UTC (rev 2278) +++ trunk/src/mugen/parser/peg.py 2009-07-29 05:23:17 UTC (rev 2279) @@ -184,9 +184,6 @@ def __init__(self): pass - def generate(self, result, stream, failure): - pass - def parens(self, pattern, str): if pattern.contains() > 1: return "(%s)" % str @@ -219,7 +216,7 @@ return data - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): not_label = "not_%d" % nextVar() my_result = newResult() my_fail = lambda : "goto %s;" % not_label @@ -228,7 +225,7 @@ %s %s %s: - """ % (my_result, result, self.next.generate(my_result, stream, my_fail).strip(), failure(), not_label) + """ % (my_result, result, self.next.generate_cpp(my_result, stream, my_fail).strip(), failure(), not_label) return data @@ -257,7 +254,7 @@ return data - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): data = """ %s = rule_%s(%s, %s.getPosition()); if (%s.error()){ @@ -311,7 +308,7 @@ return data - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): data = "" for pattern in self.patterns: my_result = newResult() @@ -321,7 +318,7 @@ %s %s.addResult(%s); } -""" % (my_result, result, pattern.generate(my_result, stream, failure), result, my_result) +""" % (my_result, result, pattern.generate_cpp(my_result, stream, failure), result, my_result) return data class PatternRepeatOnce(Pattern): @@ -353,7 +350,7 @@ return data - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): loop_done = "loop_%d" % nextVar() my_fail = lambda : "goto %s;" % loop_done my_result = newResult() @@ -367,7 +364,7 @@ if (%s.matches() == 0){ %s } - """ % (my_result, result, indent(self.next.generate(my_result, stream, my_fail).strip()), result, my_result, loop_done, result, failure()) + """ % (my_result, result, indent(self.next.generate_cpp(my_result, stream, my_fail).strip()), result, my_result, loop_done, result, failure()) return data @@ -382,7 +379,7 @@ def generate_bnf(self): data = """%s {{ - %s +%s }}""" % (self.before.generate_bnf(), self.code) return data @@ -398,7 +395,7 @@ return data - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): data = """ %s { @@ -406,7 +403,7 @@ %s %s.setValue(value); } - """ % (self.before.generate(result, stream, failure).strip(), indent(self.code.strip()), result) + """ % (self.before.generate_cpp(result, stream, failure).strip(), indent(self.code.strip()), result) return data @@ -436,9 +433,7 @@ return data - - - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): loop_done = "loop_%d" % nextVar() my_fail = lambda : "goto %s;" % loop_done my_result = newResult() @@ -449,7 +444,7 @@ %s.addResult(%s); } while (true); %s: - """ % (my_result, result, indent(self.next.generate(my_result, stream, my_fail).strip()), result, my_result, loop_done) + """ % (my_result, result, indent(self.next.generate_cpp(my_result, stream, my_fail).strip()), result, my_result, loop_done) return data class PatternAny(Pattern): @@ -490,6 +485,9 @@ """ % (save, result, self.pattern.generate_python(result, stream, fail)) return data + def generate_cpp(self, result, stream, failure): + return "todo: maybe" + class PatternOr(Pattern): def __init__(self, patterns): Pattern.__init__(self) @@ -513,7 +511,7 @@ fail = lambda : data return data - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): data = "" success = "success_%d" % nextVar() for pattern in self.patterns: @@ -530,7 +528,7 @@ } goto %s; %s: -""" % (my_result, result, pattern.generate(my_result, stream, fail).strip(), result, my_result, success, out) +""" % (my_result, result, pattern.generate_cpp(my_result, stream, fail).strip(), result, my_result, success, out) data += "%s:\n" % success return data @@ -543,6 +541,9 @@ def ensureRules(self, find): self.pattern.ensureRules(find) + def generate_cpp(self, result, stream, failure): + return "todo: bind" + def generate_bnf(self): return "%s:%s" % (self.variable, self.pattern.generate_bnf()) @@ -612,7 +613,7 @@ """ % (self.letters, stream, result, length, result, length, result, self.letters, indent(failure())) return data - def generate(self, result, stream, failure): + def generate_cpp(self, result, stream, failure): data = """ %s = "%s"; """ % (result, self.letters) @@ -685,7 +686,7 @@ return data - def generate(self): + def generate_cpp(self): def newPattern(pattern, stream, position): result = newResult() out = newOut() @@ -697,7 +698,7 @@ %s.update(%s); return %s; %s: - """ % (result, position, pattern.generate(result, stream, failure).strip(), stream, result, result, out) + """ % (result, position, pattern.generate_cpp(result, stream, failure).strip(), stream, result, result, out) return data stream = "stream" @@ -753,7 +754,7 @@ """ % (self.start, indent('\n'.join([rule.generate_bnf() for rule in self.rules]).strip())) return data - def generate(self): + def generate_cpp(self): def prototype(rule): return "Result rule_%s(Stream &, const int);" % rule.name @@ -781,13 +782,10 @@ } } - """ % (self.namespace, start_code, indent('\n'.join([prototype(rule) for rule in self.rules])), '\n'.join([rule.generate() for rule in self.rules]), self.start) + """ % (self.namespace, start_code, indent('\n'.join([prototype(rule) for rule in self.rules])), '\n'.join([rule.generate_cpp() for rule in self.rules]), self.start) return data -def generate(peg): - print peg.generate() - def test(): s_code = """ printf("parsed cheese\\n"); @@ -800,7 +798,7 @@ Rule("all", [PatternSequence([PatternVerbatim("abc"), PatternVerbatim("def"), PatternVerbatim("ghi")])]), ] peg = Peg("Peg", "s", rules) - generate(peg) + print peg.generate_cpp() def create_peg(peg): # import imp @@ -839,7 +837,7 @@ ] peg = Peg("Peg", "start", rules) - generate(peg) + print peg.generate_cpp() def make_peg_parser(): start_code_abc = """ @@ -1052,4 +1050,4 @@ if len(sys.argv) > 1: out = parser(sys.argv[1]) print out - print out.generate_bnf() + print out.generate_cpp() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |