Get a string output using Rply throws ParserGeneratorError: Expecting :

Get a string output using Rply throws ParserGeneratorError: Expecting :

尝试使用 rply 实现解析器,就像 ply

#Input = ['ABC']
lg = LexerGenerator()
lg.add('String', r'\D')

l = lg.build()
for token in l.lex('ABC'):
  print(token)

通过以上代码生成词法分析器

class String(BaseBox):
  def __init__(self, value):
    self.value = value 
  def eval(self):
    return self.value


from rply import ParserGenerator
pg = ParserGenerator(
# A list of all token names, accepted by the parser. 
     ['String']
)
@pg.production('program: String')
def program(p):
    return p[0].value

parser = pg.build() #should parse string 'ABC'

ParserGeneratorError: Expecting :

困惑这甚至不在文档中,请回复。 希望我的输出将 stringn 读取为 'ABC'

您的代码表明您测试了词法分析器。但是,测试表明词法分析器没有生成正确的标记:

>>> for token in l.lex('ABC'):
...   print(token)
... 
Token('String', 'A')
Token('String', 'B')
Token('String', 'C')

预期的输出是

Token('String', 'ABC')

您拆分单个字符的原因是您识别 String 的模式仅匹配单个字符:

lg.add('String', r'\D')

可能你想要更像

的东西
lg.add('String', r'\D+')

但请注意,\D 匹配任何非十进制数字的内容,包括空格、标点符号和控制字符。也许这就是你想要的,但对我来说似乎有点太宽容了。


不相关,但你也必须解决这个问题:据我所知,RPLY(像 Ply)要求你编写语法规则,冒号周围有空格,所以你的解析器函数需要

@pg.production('program : String')
def program(p):
    return p[0].value