【发布时间】:2013-12-12 12:08:31
【问题描述】:
我的目标是像 Python 那样解析字符串。
问题:如何编写一个 lex 来支持以下内容:
"string..."'string...'"""multi line string \n \n end"""'''multi line string \n \n end'''
一些代码:
状态 = ( ('字符串','排他'), ) # 字符串 def t_begin_string(self, t): r'(\'|(\'{3})|\"|(\"{3}))' t.lexer.push_state('字符串') def t_string_end(self, t): r'(\'|(\'{3})|\"|(\"{3}))' t.lexer.pop_state() def t_string_newline(self, t): r'\n' t.lexer.lineno += 1 def t_string_error(self, t): print("字符串 '%s' 中有非法字符" % t.value[0]) t.lexer.skip(1)我目前的想法是创建 4 个唯一状态,以匹配 4 种不同的字符串情况,但我想知道是否有更好的方法。
感谢您的帮助!
【问题讨论】:
-
您有 4 种不同的字符串类型,所以我希望您需要 4 种不同的状态。大概
'string"格式不正确? -
您可以使用两种唯一状态,一种用于单引号,一种用于三引号,但您需要将引号字符存储在某处。哪种方法更好值得商榷。
-
我担心建立 4 个州...两个可以通过吗?因为开始/结束状态与初始开始报价类型不匹配。例如
"string..'...string..."解析器会将string..视为字符串,然后将...string..."视为解析错误。 -
如果你只使用了两个状态,你需要存储你开始的引号,然后如果你遇到一个引号你检查它是否是开始标记,如果不是,继续在相同的状态.