我需要为自定义语言解析器定义字符串。我使用modgrammar来定义这个语言解析器。此语言(sqf)具有允许嵌套的数据类型String。
字符串由标准双引号(")表示,字符串中的字符串由两组双引号示例表示。
"this is a string ""this is a string within a string"""
据我所知,筑巢水平没有限制。
到目前为止,我已尝试以下方法来解析字符串:
from modgrammar import *
class String (Grammar):
grammar = (
(L("\""), ANY_EXCEPT("\""), (L("\"")),
(
OPTIONAL((L("\""),
REF("String"),
(L("\""))
)
)
String.grammar_resolve_refs()
和
class String (Grammar):
grammar = (
(L("\""),
ANY_EXCEPT("\""),
(L("\"")
)
class StringNested (Grammar):
grammar = (String,OPTIONAL((L("\""),REF("StringNested"),(L("\""))
)
和:
class StringBase (Grammar):
grammar_greedy = True
grammar = (REPEAT(WORD("A-Za-z0-9")))
class String (Grammar):
# grammar =(OR(
# OR((StringBase,LITERAL('"'),StringBase, LITERAL('"')), (LITERAL('"'),StringBase,LITERAL('"'),StringBase) ),
# StringBase,
# ))
grammar = L('"'),OPTIONAL(L('"'),StringBase,L('"')), OPTIONAL(LITERAL('"'),L('"'),REF("String"), LITERAL('"'),L('"')), (StringBase),L('"')
这些似乎都没有起作用。
编辑:使用python 3.4和modgrammar 0.10 编辑2:注意: 我发现虽然mod语法很强大并且擅长它的功能但它可能不是正确的解决方案我的问题,我发现手动编码线性解析在解析数据方面效率更高,在这种情况下提供的数据已经是程序输出和因此,不太可能以需要如modgrammar允许的那样广泛测试的方式包含错误。
答案 0 :(得分:0)
所以我终于找到了一个似乎有效的解决方案(待广泛测试)。
答案可以在这里找到:
Google Groups: Parsing Escaped Characters
Dan S发布:
丹·S 2012年8月9日
找到一种方法:
语法=(''',ZERO_OR_MORE(WORD('^“')| WORD('^ \','”',count = 2)),'“')