首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python YACC EOF立即到达

Python YACC EOF立即到达
EN

Stack Overflow用户
提问于 2015-05-10 20:35:02
回答 2查看 304关注 0票数 3

晚上好,

我正在学习使用Ply (Python3/ Win 8.1系统)在lex/yacc上工作,但我遇到了一个麻烦:我似乎无法让yacc正确地读取输入文件。

如果我硬编码输入文件的内容,我就会得到预期的结果,但是如果我尝试从它读取,yacc就会从状态0到达文件的末尾,在它真正开始之前停止语法分析。

以下是我的主要内容(上面定义了标记和语法规则--它们似乎并不是问题所在,因为当输入是硬编码时,程序运行良好):

代码语言:javascript
复制
if __name__ == "__main__":
import sys
lexer = lex.lex()
yacc.yacc()
inputfile = open(sys.argv[1], 'r', encoding="UTF-8")
lexer.input(inputfile.read())
for token in lexer: #for this part, the file is read correctly
    print("line %d : %s (%s) " % (token.lineno, token.type, token.value))

result = yacc.parse(inputfile.read(), debug=True)
print(result) #Stack immediately contains . $end and the p_error(p) I've defined confirms EOF was reached
tmp = "{{var1 := 'some text' ; var2 := 'some other text' ; var3 := ( 'text', 'text2') ; }}" #Same contents as the input file
result = yacc.parse(tmp, debug=True)
print(result) #correct results
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-10 20:40:01

inputfile.read()读取到文件的末尾,所以在它成功完成之后,您知道文件位于EOF。

您应该只读取()文件的内容一次:

代码语言:javascript
复制
if __name__ == "__main__":
    import sys
    lexer = lex.lex()
    yacc.yacc()

    with open(sys.argv[1], 'r', encoding="UTF-8") as inputfile:
        contents = inputfile.read()
        lexer.input(contents)
        for token in lexer: #for this part, the file is read correctly
            print("line %d : %s (%s) " % (token.lineno, token.type, token.value))

        result = yacc.parse(contents, debug=True)
        print(result) #Stack immediatly contains . $end and the p_error(p) I've defined confirms EOF was reached
        tmp = "{{var1 := 'some text' ; var2 := 'some other text' ; var3 := ( 'text', 'text2') ; }}" #Same contents as the input file
        result = yacc.parse(tmp, debug=True)
        print(result) #correct results
票数 4
EN

Stack Overflow用户

发布于 2015-05-10 20:53:58

使用"with as“也可能是一个好主意,它更容易阅读(imo),并且更‘健壮’:

代码语言:javascript
复制
with open(sys.argv[1], 'r', encoding="UTF-8") as inputfile:
    lexer.input(inputfile.read())

请参阅:https://www.python.org/dev/peps/pep-0343/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30156365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档