Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: tools/lexer_generator/rule_parser.py

Issue 149113010: Experimental parser: unify parser construction (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/parser
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/lexer_generator/regex_parser.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/lexer_generator/rule_parser.py
diff --git a/tools/lexer_generator/rule_parser.py b/tools/lexer_generator/rule_parser.py
index ec4a420f6c8452900abd43e85f7fd35042cad3cd..788f182a3012588e2806524ec0bdb922ed9dc89f 100644
--- a/tools/lexer_generator/rule_parser.py
+++ b/tools/lexer_generator/rule_parser.py
@@ -28,7 +28,7 @@
import ply.lex as lex
import ply.yacc as yacc
from action import Term, Action
-from regex_parser import RegexParser
+from regex_parser import RegexParser, ParserBuilder
from nfa_builder import NfaBuilder
from dfa import Dfa
from dfa_optimizer import DfaOptimizer
@@ -96,18 +96,9 @@ class RuleLexer:
t_ACTION_CLOSE = '>'
t_COMMA = ','
- def t_LEFT_BRACKET(self, t):
- r'{'
- self.lexer.push_state('code')
- self.nesting = 1
- return t
-
def t_ANY_error(self, t):
raise Exception("Illegal character '%s'" % t.value[0])
- def build(self, **kwargs):
- self.lexer = lex.lex(module=self, **kwargs)
-
class RuleParserState:
def __init__(self, encoding):
@@ -297,6 +288,7 @@ class RuleParser:
escape_char = lambda string, char: string.replace(char, "\\" + char)
string = reduce(escape_char, "+?*|.[](){}", string).replace("\\\"", "\"")
p[0] = RegexParser.parse(string)
+
def p_regex(self, p):
'regex : REGEX'
string = p[1][1:-1].replace("\\/", "/")
@@ -323,26 +315,16 @@ class RuleParser:
def p_error(self, p):
raise Exception("Syntax error in input '%s'" % str(p))
- def build(self, **kwargs):
- self.parser = yacc.yacc(module=self, debug=0, write_tables=0, **kwargs)
- self.lexer = RuleLexer()
- self.lexer.build(**kwargs)
-
- __static_instance = None
@staticmethod
- def parse(data, parser_state):
- parser = RuleParser.__static_instance
- if not parser:
- parser = RuleParser()
- parser.build()
- RuleParser.__static_instance = parser
- parser.__state = parser_state
- try:
- parser.parser.parse(data, lexer=parser.lexer.lexer)
- except Exception:
- RuleParser.__static_instance = None
- raise
- parser.__state = None
+ def parse(string, parser_state):
+ new_lexer = lambda: RuleLexer()
+ new_parser = lambda: RuleParser()
+ def preparse(parser):
+ parser.__state = parser_state
+ def postparse(parser):
+ parser.__state = None
+ return ParserBuilder.parse(
+ string, "RuleParser", new_lexer, new_parser, preparse, postparse)
class RuleProcessor(object):
« no previous file with comments | « tools/lexer_generator/regex_parser.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698