से पाइथन पीएलवाई लेक्सर राज्यों को नियंत्रित करना मैं क्वेरी पार्सर जैसे सरल एसक्यूएल चयन पर काम कर रहा हूं और मुझे कुछ स्थानों पर होने वाली उप-श्रेणियों को कैप्चर करने में सक्षम होना चाहिए। मैंने पाया कि लेक्सर राज्य सबसे अच्छा समाधान हैं और प्रारंभ और अंत को चिह्नित करने के लिए घुंघराले ब्रेसिज़ का उपयोग करके पीओसी करने में सक्षम थे। हालांकि, subqueries कोष्ठक द्वारा सीमित किया जाएगा, घुंघराले नहीं, और अन्य स्थानों पर भी संश्लेषण हो सकता है, इसलिए मैं हर खुले-पैर के साथ राज्य नहीं हो सकता। यह जानकारी पार्सर के साथ आसानी से उपलब्ध है, इसलिए मैं पार्सर नियमों में उपयुक्त स्थानों पर शुरू और अंत करने की उम्मीद कर रहा था। हालांकि यह काम नहीं करता क्योंकि लेक्सर एक बार में स्ट्रीम को टोकनिज़ करना प्रतीत होता है, और इसलिए टोकन को प्रारंभिक राज्य में उत्पन्न किया जाता है। क्या इस समस्या के लिए कोई समाधान है?पार्सन
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
lexer टोकन बंद कोष्ठक पता लगाने के लिए बस देखते हैं :
@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
मैं किसी भी मदद की सराहना करता हूं।
सूचक के लिए सूचक के लिए धन्यवाद, यह बहुत ही आशाजनक लग रहा है। हालांकि, आपके उदाहरण में, हमें अंतिम टोकन के बजाय लुकहेड टोकन की जांच करनी है? आखिरी टोकन 'बी' होगा, लेकिन लुकहेड 'एलबीआरएसीई' सही होगा? – haridsv