Basit bir SQL sorgu seçicisi gibi çalışıyorum ve belirli yerlerde gerçek zamanlı olarak oluşabilecek alt sorguları yakalayabilmem gerekiyor. Lexer durumlarının en iyi çözüm olduğunu buldum ve başlangıç ve bitiş işaretlemek için kaşlı ayraçlar kullanarak POC yapabiliyordum. Bununla birlikte, alt sorgular parantez ile sınırlandırılmayacaktır, kıvrımlar değil ve parantez diğer yerlerde de meydana gelebilir, bu yüzden her açık parenle devlet olamıyorum. Bu bilgi ayrıştırıcı ile kolayca kullanılabilir, bu yüzden ayrıştırıcı kurallarında uygun yerlerde başlangıç ve bitiş çağrısı yapmayı umuyordum. Ancak bu, işe yaramadı çünkü lexer akışı bir kerede belirtiyor gibi görünüyor ve bu yüzden jetonlar INITIAL durumunda üretiliyor. Bu sorun için bir çözüm var mı?Python PLY lexer denetleniyor ayrıştırıcıdan ayrılıyor
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() ve end_subquery() böyle tanımlanır: Burada yapmaya çalıştığım şeyin bir taslak olduğunu
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
lexer belirteçleri yakın paren algılamak için sadece orada :
@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
Herhangi bir yardım için minnettarım.
Dmbedded eylemlerinin işaretçisi için teşekkürler, çok umut verici görünüyor. Ancak, örneğinizde, son belirteç yerine lookahead simgesini kontrol etmemiz gerekiyor? Son belirteç “B” olurdu, fakat göze bakacak olursak “LBRACE” doğru mu? – haridsv