Pyparsing:如何解析SQL提示

Pyparsing:如何解析SQL提示,sql,comments,pyparsing,recursive-datastructures,hints,Sql,Comments,Pyparsing,Recursive Datastructures,Hints,我正在尝试解析下面的EBNF(在代码中注释),我正在努力解析可选注释的字符串部分。。(在我的测试字符串中作为额外注释编写) 从pyparsing导入* #SQL提示EBNF ''' {/*+提示[字符串] [提示[字符串]]*/ |---+提示[字符串] [提示[字符串]。。。 } ''' test_string=“/*+所有_行额外注释第一个_行缓存*” LCOMMENT=Literal(“/*+”) RCOMMENT=Literal(“*/”) 语法=前进() 提示所有行=文字(“所有行”)

我正在尝试解析下面的EBNF(在代码中注释),我正在努力解析可选注释的字符串部分。。(在我的测试字符串中作为额外注释编写)

从pyparsing导入*
#SQL提示EBNF
'''
{/*+提示[字符串]
[提示[字符串]]*/
|---+提示[字符串]
[提示[字符串]。。。
}
'''
test_string=“/*+所有_行额外注释第一个_行缓存*”
LCOMMENT=Literal(“/*+”)
RCOMMENT=Literal(“*/”)
语法=前进()
提示所有行=文字(“所有行”)
hint\u first\u rows=文字(“first\u rows”)
提示\u cache=Literal(“缓存”)
注释在提示中=Word(可打印)
所有提示=(提示所有行、提示第一行、提示缓存)+零或更多(提示中的注释)

语法这是由于Paul McGuire在OP上的注释帮助而运行的代码。最初在这里设置答案时,我确实去掉了forward函数。但是通过将结果名称附加到不同的元素来检查代码,我注意到我在这里的第一个答案是将除第一个提示以外的所有提示分类为注释。因此因此,我继续向前,但利用了保罗的一些其他建议

from pyparsing import *

# SQL HINT EBNF
'''
{ /*+ hint [ string ]
      [ hint [ string ] ]... */
| --+ hint [ string ]
      [ hint [ string ]...
}
'''

LCOMMENT = Literal("/*+")
RCOMMENT = Literal("*/")

grammar = Forward()

hint_all_rows = Keyword("ALL_ROWS")
hint_first_rows = Keyword("FIRST_ROWS")
hint_cache = Keyword("CACHE")

comment_in_hint = Word(printables, excludeChars='*')

grammar = Forward()

all_hints = (hint_all_rows | hint_first_rows | hint_cache).setResultsName("Hints", listAllMatches=True) + Optional(comment_in_hint)("Comments*")

grammar << all_hints + ZeroOrMore(grammar)

all_grammar = LCOMMENT + grammar + RCOMMENT

p = all_grammar.parseString("/*+ ALL_ROWS aaaaaaa FIRST_ROWS bbbbb */")

print p["Hints"]

print p["Comments"]
从pyparsing导入*
#SQL提示EBNF
'''
{/*+提示[字符串]
[提示[字符串]]*/
|---+提示[字符串]
[提示[字符串]。。。
}
'''
LCOMMENT=Literal(“/*+”)
RCOMMENT=Literal(“*/”)
语法=前进()
提示所有行=关键字(“所有行”)
提示第一行=关键字(“第一行”)
提示\缓存=关键字(“缓存”)
注释\u in_hint=Word(可打印,不包括字符='*'))
语法=前进()
所有提示=(提示所有行、提示第一行、提示缓存)。setResultsName(“提示”,listAllMatches=True)+可选(提示中的注释)(“注释*”)

语法这是由于Paul McGuire在OP上的注释帮助而运行的代码。最初在这里设置答案时,我确实去掉了forward函数。但是通过将结果名称附加到不同的元素来检查代码,我注意到我在这里的第一个答案是将除第一个提示以外的所有提示分类为注释。因此因此,我继续向前,但利用了保罗的一些其他建议

from pyparsing import *

# SQL HINT EBNF
'''
{ /*+ hint [ string ]
      [ hint [ string ] ]... */
| --+ hint [ string ]
      [ hint [ string ]...
}
'''

LCOMMENT = Literal("/*+")
RCOMMENT = Literal("*/")

grammar = Forward()

hint_all_rows = Keyword("ALL_ROWS")
hint_first_rows = Keyword("FIRST_ROWS")
hint_cache = Keyword("CACHE")

comment_in_hint = Word(printables, excludeChars='*')

grammar = Forward()

all_hints = (hint_all_rows | hint_first_rows | hint_cache).setResultsName("Hints", listAllMatches=True) + Optional(comment_in_hint)("Comments*")

grammar << all_hints + ZeroOrMore(grammar)

all_grammar = LCOMMENT + grammar + RCOMMENT

p = all_grammar.parseString("/*+ ALL_ROWS aaaaaaa FIRST_ROWS bbbbb */")

print p["Hints"]

print p["Comments"]
从pyparsing导入*
#SQL提示EBNF
'''
{/*+提示[字符串]
[提示[字符串]]*/
|---+提示[字符串]
[提示[字符串]。。。
}
'''
LCOMMENT=Literal(“/*+”)
RCOMMENT=Literal(“*/”)
语法=前进()
提示所有行=关键字(“所有行”)
提示第一行=关键字(“第一行”)
提示\缓存=关键字(“缓存”)
注释\u in_hint=Word(可打印,不包括字符='*'))
语法=前进()
所有提示=(提示所有行、提示第一行、提示缓存)。setResultsName(“提示”,listAllMatches=True)+可选(提示中的注释)(“注释*”)

语法“extra”和“comment”不会出现在解析器中的任何地方,也没有像
Word(printables)
这样可以接受任何一组非空白字符的catch-all类型元素。Paul,这是一个快速响应。现在我觉得没有包含我的工作有点愚蠢!(正如你所看到的,我不是一个有经验的SO用户……)…我将编辑我的OP,正如您已经猜测的那样,使用一个catch all。然而,这会导致捕获后面的两个提示,FIRST_ROWS和CACHE..我试图在edit中输入测试,但它没有显示(我想!)我已经在代码中添加了一个catch all(comment_in_hint),但是它贪婪并吃掉了结束注释括号(RCOMMENT)…要使事情正常进行,请更改为
comment\u in\u hint=Word(可打印,excludeChars='*'))
。在某些情况下,当您的注释包含嵌入的“*”字符时,这将失败,但这将有助于您目前取得一些进展。我不会将
comment\u合并到\u-hint
中,作为
all\u-hints
的一部分。相反,have
all\u-hints
只是定义的提示列表,但更改
语法
to
语法“extra”和“comment”不会出现在解析器中的任何地方,也没有像
Word(printables)
这样可以接受任何一组非空白字符的catch-all类型元素。Paul,这是一个快速响应。现在我觉得没有包含我的工作有点愚蠢!(正如你所看到的,我不是一个有经验的SO用户…)。正如你已经猜测的那样,我将用一个catch-all来编辑我的OP。但是,这会导致后面的两个提示,第一行和缓存被捕获。我试图在edit中输入测试,但它没有显示(我想!)我添加了一个catch-all(注释\u-in\u-hint)对于代码来说,它是贪婪的,并且会吃掉结束注释括号(RCOMMENT)…为了让事情正常进行,请更改为
comment\u in_hint=Word(可打印,excludeChars='*'))
。在某些情况下,当您的注释包含嵌入的“*”字符时,这将失败,但这将有助于您目前取得一些进展。我不会将
comment\u合并到\u-hint
中,作为
all\u-hints
的一部分。相反,have
all\u-hints
只是定义的提示列表,但更改
语法
语法