1
以下のEBNFを解析しています(コードにコメントがあります)。オプションのコメントのSTRING部分を解決しようとしています。(テスト文字列に余分なコメントとして書かれています)Pyparsing:SQLヒントを解析する方法
from pyparsing import *
# SQL HINT EBNF
'''
{ /*+ hint [ string ]
[ hint [ string ] ]... */
| --+ hint [ string ]
[ hint [ string ]...
}
'''
test_string = "/*+ALL_ROWS extra comment FIRST_ROWS CACHE*/"
LCOMMENT = Literal("/*+")
RCOMMENT = Literal("*/")
grammar = Forward()
hint_all_rows = Literal("ALL_ROWS")
hint_first_rows = Literal("FIRST_ROWS")
hint_cache = Literal("CACHE")
comment_in_hint = Word(printables)
all_hints = (hint_all_rows | hint_first_rows | hint_cache)+ ZeroOrMore(comment_in_hint)
grammar << all_hints + ZeroOrMore(grammar)
all_grammar = LCOMMENT + grammar + RCOMMENT
p = all_grammar.parseString(test_string)
print p
"extra"と "comment"はパーサのどこにも表示されず、 'Word(printables) 'のような非空白文字のグループを受け入れるキャッチオール型の要素はありません。 – PaulMcG
Paul、それは速い応答です。そして、今私は私の仕事を含めていないために少し愚かな感じ! (私が経験豊富なSOのユーザーではないことがわかるように)..私はあなたがすでに推測したように、キャッチオールで私のOPを編集するでしょう。しかし、これは末尾の2つのヒント、FIRST_ROWSとCACHEを捕まえる原因となります。 –
そして、私は編集でテストに入ることを試みましたが、私はそのコードにcatch(all)(comment_in_hint)を追加しました(RCOMMENT)を食べます。 –