python - PLY - 添加第二个相似行时出现解析错误

标签 python parsing ply

我正在使用一个简单的 .txt 文件测试层,其中包含:value = 0.4。解析器按预期工作,但是当我向该文件添加第二行时,出现错误:

错误:解析“LexToken(VALUE_KEY,'value',1,15)”时出现语法错误

我的解析器:

from ply import lex
from ply import yacc
from sys import argv

tokens = ('PROBABILITY',
          'EQUALS',
          'VALUE_KEY',
          'NAME')

t_ignore = ' \t'
t_EQUALS = r'='

reserved = {'value' : 'VALUE_KEY'}

def t_KEYWORD(t):
    r':?[a-zA-z_][a-zA-Z_0-9\-]*'
    t.type = reserved.get(t.value, 'NAME')
    return t

def t_NAME(t):
    r'[a-zA-z_][a-zA-Z_0-9\-]*'
    return t

def t_PROBABILITY(t):
    r'[0-1]\.\d+'
    t.value = float(t.value)
    return t

def t_newline(t):
    r'\n+'
    t.lineno += len(t.value)

def t_error(t):
    print("Error: illegal character '{}'".format(t))
    t.lexer.skip(1)


# build the lexer
lex.lex()

def p_prob_def(p):
    '''prob_def : VALUE_KEY EQUALS PROBABILITY'''
    p[0] = p[3]

def p_error(p):
    print("Error: syntax error when parsing '{}'".format(p))

# build parser
yacc.yacc()

class ToyParser(object):

    @classmethod
    def parse(cls, filename):
        with open(filename, 'r') as file:
            data = ''
            for line in file:
                data += '\n' + line
        return yacc.parse(data)

if __name__=='__main__':
    test = ToyParser.parse(argv[1])
    print(test)

产生错误的输入文件:

value = 0.4 
value = 0.7

最佳答案

您的语法只能识别单个prob_def。 Ply 解析器与许多解析器生成器生成的解析器一样,坚持语法中的起始符号与整个输入匹配(否则,尾随垃圾将不会被正确识别为错误)。

如果你想让语法解析多个对象,你需要写一个明确的规则:

def p_empty(p):
    '''program :'''
    p[0] = []

def p_program(p): 
    '''program : program prob_def '''
    p[0] = p[1]
    p[0].append(p[2])

这些需要放在 prob_def 的定义之前,以便 program 成为开始符号。

关于python - PLY - 添加第二个相似行时出现解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51911313/

相关文章:

java - Android 远程 XML 解析(文档生成器)

python - PLY yacc解析IF-ELSE IF-ELSE嵌套语句

Python not in dict 条件句性能

python - 如何防止使用 tkinter 调整窗口大小?

javascript - 使用 JavaScript 解析 JSON 多个级别

javascript - 如何在 Angular 中读取在线 html 文档并转换为字符串

python - 如果-else if-else语句,您将如何解析标准? (使用RPLY)

python - VBA 的上下文无关语法

python - 深入——yield from inside yield

python - Pandas 检查平等性太慢而无法使用