我正在开发一个简单的类似于SQL查询的解析器,需要能够精确捕获出现在某些位置的子查询。我发现词法分析器状态是最好的解决方案,并能够使用花括号标记起始和结束进行POC。然而,子查询将由括号而不是花括号限定,并且括号还可以出现在其他地方,因此我无法从每个打开括号开始跟踪状态。这些信息已经在解析器中可用,所以我希望在适当的解析器规则位置调用begin和end。但是,这并没有奏效,因为词法分析器似乎一次性对整个流进行标记化,因此标记在INITIAL状态下生成。是否有解决此问题的方法?以下是我尝试做的概述:
词法分析器标记仅用于检测右括号的存在:
def p_value_subquery(p):
"""
value : start_sub end_sub
"""
p[0] = "( " + p[1] + " )"
def p_start_sub(p):
"""
start_sub : OPAR
"""
start_subquery(p.lexer)
p[0] = p[1]
def p_end_sub(p):
"""
end_sub : CPAR
"""
subquery = end_subquery(p.lexer)
p[0] = subquery
start_subquery()和end_subquery()的定义如下:
def start_subquery(lexer):
lexer.code_start = lexer.lexpos # Record the starting position
lexer.level = 1
lexer.begin('subquery')
def end_subquery(lexer):
value = lexer.lexdata[lexer.code_start:lexer.lexpos-1]
lexer.lineno += value.count('\n')
lexer.begin('INITIAL')
return value
词法分析器标记仅用于检测右括号的存在:
@lex.TOKEN(r"\(")
def t_subquery_SUBQST(t):
lexer.level += 1
@lex.TOKEN(r"\)")
def t_subquery_SUBQEN(t):
lexer.level -= 1
@lex.TOKEN(r".")
def t_subquery_anychar(t):
pass
我很感激你的帮助。
B
,但前瞻将是LBRACE
,对吗? - haridsv