Lex带有单引号,双引号或三引号

Ste*_*eak 14 python yacc ply lexer

我的目标是像Python一样解析字符串.

问题:如何编写lex以支持以下内容:

  1. "string..."
  2. 'string...'
  3. """multi line string \n \n end"""
  4. '''multi line string \n \n end'''

一些代码:

states = (
        ('string', 'exclusive'),
        )

# Strings
def t_begin_string(self, t):
    r'(\'|(\'{3})|\"|(\"{3}))'
    t.lexer.push_state('string')

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("Illegal character in string '%s'" % t.value[0])
    t.lexer.skip(1)


我目前的想法是创建4个独特的状态,将匹配4个不​​同的字符串案例,但我想知道是否有更好的方法.

谢谢你的帮助!

Pau*_*low 0

尝试使用pyparsing 模块。使用此模块,您可以轻松地解析具有良好样式的字符串,而无需使用正则表达式。

下面的示例应该可以帮助您解析诸如"string..."and"""string"""之类的表达式。

from pyparsing import Word, OneOrMore, alphas

string = """string"""
w = OneOrMore('\"') + Word(alphas + '.') + OneOrMore('\"')
w.parseString(string)
Run Code Online (Sandbox Code Playgroud)