gpt4 book ai didi

Python PLY 解析器语法错误

转载 作者:行者123 更新时间:2023-12-01 06:03:49 27 4
gpt4 key购买 nike

全部,

我正在用 python PLY 编写一个非常简单的解析器。它大部分完成了这项工作,但对于许多输入行,我从yacc收到语法错误。这是词法分析器和解析器代码,稍作修改以方便测试:

tokens = ('VAR', 'NUMBER', 'CLOSE', 'JUNK')

# Tokens

t_VAR = r'%[mM]\['
t_CLOSE = r'\]'
t_JUNK = r'.'

# Ignored characters
t_ignore = " \t\r"

def t_NUMBER(t):
r'\d+'
try:
t.value = int(t.value)
except ValueError:
print("Integer value too large %d", t.value)
t.value = 0
return t

def t_newline(t):
r'\n+'
t.lexer.lineno += t.value.count("\n")

def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)

# Build the lexer
import ply.lex as lex
lex.lex()

# Parsing rules

def p_statement(p):
'''statement : field'''
try:
print p[1]
except IndexError:
pass

def p_trash(p):
'''statement : JUNK'''
pass

def p_field(p):
'''field : VAR NUMBER CLOSE'''
#print p[1], p[2], p[3]
p[0] = p[2]

def p_error(p):
print("Syntax error at '%s'" % repr(p)) #p.value)

import ply.yacc as yacc
yacc.yacc()

对于示例:yacc.parse('.set %m[702] $substr($currentlength,2,$currentpg)') 其输出为:

Syntax error at 'LexToken(JUNK,'s',1,1)'
Syntax error at 'LexToken(JUNK,'$',1,13)'

它应该只输出702

最佳答案

您的顶级规则需要一条语句。 p_trash 匹配第一个“.”并返回一个语句,并且没有顶级规则允许它继续。你可以这样做:

def p_junk(p):
'''statement | JUNK statement'''

您也可以执行类似的操作(并创建语句列表):

def p_statements(p):
'''statements | statement statements
| empty'''

关于Python PLY 解析器语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9039445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com