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
尝试使用 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