- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Python Lex-Yacc (PLY) 实现容错解析器,但在输入字符串末尾使用错误恢复规则时遇到问题。
如何从意外的输入结束中恢复?
此示例语法生成以下形式的字符串 A END A END A END A END
...
Statement : Expressions
Expressions : Expression Expressions
|
Expression : A END
如果省略了 END token ,我想执行错误恢复,因此解析器将识别诸如 A A A END
或 A A A
之类的字符串。
我添加了一个错误恢复规则,它允许我接受像 A A A END
这样的输入
Expression : A END
| A error
这允许我接受以下输入:A A A END
但是如果省略最后一个 END 标记 (A A A
),我仍然会收到语法错误并且无法恢复。
from __future__ import print_function
# Tokens
tokens = ('A', 'END')
t_A = r'A'
t_END = r'END'
t_ignore = " "
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()
# Rules
def p_statement_expr(p):
'''statement : expressions'''
print("parsed:", p[1])
def p_expressions(p):
'''expressions : expression expressions'''
p[0] = [p[1]] + p[2]
def p_expressions_empty(p):
'''expressions : '''
p[0] = list()
def p_expression_pharse(p):
'''expression : A END
| A error'''
p[0] = 'A'
def p_error(p):
if p:
print("Syntax error at '%s'" % p.value)
else:
print("Syntax error at EOI")
import ply.yacc as yacc
yacc.yacc()
while 1:
try:
s = raw_input('query > ') # use input() on Python 3
except EOFError:
break
yacc.parse(s)
最佳答案
我将其添加为新答案(并且确实知道对于赏金来说为时已晚:-( ),因为这是一种非常不同的方法。如果我们使用 flex
,它会容易得多,因为它具有<<EOF>>
标记仅在文件末尾匹配的概念。经过思考,我意识到通过使用围绕词法分析器的代理。由于 __getattr__
特殊方法,Python 允许轻松实现代理。
我只是添加
EOF
将在文件末尾发送token
的代理词法分析器的方法,在文件末尾返回特殊的 EOF
第一次传递 token ,然后是正常的 None
statement
规则并且仍然颠倒规则expressions : expressions expression
而不是expressions : expression expressions
允许立即减少
代码变为:
from __future__ import print_function
# Tokens
tokens = ('A', 'END', 'EOF')
t_A = r'A'
t_END = r'END'
t_ignore = " "
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
# Build the lexer
import ply.lex as lex
orig_lexer = lex.lex()
class ProxyLexer(object):
def __init__(self, lexer, eoftoken):
self.end = False
self.lexer = lexer
self.eof = eoftoken
def token(self):
tok = self.lexer.token()
if tok is None:
if self.end :
self.end = False
else:
self.end = True
tok = lex.LexToken()
tok.type = self.eof
tok.value = None
tok.lexpos = self.lexer.lexpos
tok.lineno = self.lexer.lineno
# print ('custom', tok)
return tok
def __getattr__(self, name):
return getattr(self.lexer, name)
lexer = ProxyLexer(orig_lexer, 'EOF')
# Rules
def p_statement_expr(p):
'''statement : expressions EOF'''
print("parsed:", p[1])
def p_expressions(p):
'''expressions : expressions expression'''
p[0] = p[1] + [p[2]]
def p_expressions_empty(p):
'''expressions : '''
p[0] = list()
def p_expression_pharse(p):
'''expression : A END
| A error'''
p[0] = 'A'
def p_error(p):
if p:
print("Syntax error at '%s'" % p.value)
else:
print("Syntax error at EOI")
import ply.yacc as yacc
parser = yacc.yacc()
while 1:
try:
s = raw_input('query > ') # use input() on Python 3
except EOFError:
break
parser.parse(s, lexer = lexer)
这样:
关于yacc - Python Lex-Yacc (PLY) 输入结束时的错误恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26338060/
在 ms sql 2008 中编写一些存储过程时,当我输入一些变量名称时,我注意到 PLI 被突出显示为关键字。 有谁知道 PLI 的用途是什么? 最佳答案 您可以在 MSDN 上查看此类信息: 请参
我想使用 plyr 的并行功能函数内封装。 我原以为导出在函数体内创建的对象的正确方法(在本例中,对象是 df_2 )如下 # rm(list=ls()) library(plyr) library(
我是 3D 重建的新手,我有点云。我把它写在 .ply 文件上。但是当我按下它文件时 Meshlab 为我提供了一个 Error 。请找到以下内容,meshlab 可以允许打开该文件 Unespec
我正在使用一个简单的 .txt 文件测试层,其中包含:value = 0.4。解析器按预期工作,但是当我向该文件添加第二行时,出现错误: 错误:解析“LexToken(VALUE_KEY,'value
全部, 我正在用 python PLY 编写一个非常简单的解析器。它大部分完成了这项工作,但对于许多输入行,我从yacc收到语法错误。这是词法分析器和解析器代码,稍作修改以方便测试: tokens =
有没有办法对层词法分析器规则进行特殊处理? t_IDENT = r'[a-zA-Z_][0-9a-zA-Z_]*' t_OPERATOR = r'[<>=/*+-]+' t_DEFINE
我正在 python 中使用 PLY 构建解析器,当我运行解析器时,它会创建 3 个文件:parsetab.py、lextam.py 和 parse.out 如何才能不创建这些文件?有一个参数可以做到
我试图四处寻找这个问题的答案,但似乎找不到。我正在尝试使用 PLY 在 Python 中编写一个解析器作为一种编造的语言。我的 BNF 的简化版本如下所示: statement-list -> sta
我正在使用 Python 和 PLY 来解析类似 LISP 的 S 表达式,并且在解析函数调用时可以有零个或多个参数。我怎样才能将它放入 yacc 代码中。到目前为止,这是我的功能: def p_EX
所以我在 Ply 上编写了一个语法来识别基本的 C 语句,例如变量声明或 while 语句。现在,我想要做的是能够连接所有标记,然后打印它或让它在树上传播,如下所示: def p_whileStm
我正在尝试创建一个将我的脚本作为输入的解释器。我在编写正则表达式时遇到了一些问题。定义的标记之一是将所有字符串视为标记。 import ply.lex as lex import ply.yacc a
我想使用Python的PLY分析大量文本,其大小可能达到 1GB。 是否可以让 PLY 读取文本并将其解析为流,这样我就不必将整个内容加载到内存中?我想逐行检查文本,并让 PLY 对其进行分析。那可能
我正在尝试使用PLY lex / yacc解析PDF,而我却遇到了有关yacc解析规则的问题,该规则控制NUMBER标记,数组和indirect_references。 相关资料来源: def p_v
简而言之,我们如何区分使用了哪个规则 - 例子:- ''' p : a b | c | d '''所以假设我们需要为不同的规则编写不同的代码。那么有什么优雅的方法可以做到这一点。手册中给出的一种方法是
我在 PLY 中使用一个相当简单的解析器,我的规则之一采用以下形式: def p_things(p): ''' things : thing things things : t
我正在尝试构建一个 .PLY 解析器,以将存储为 .ply 文件的 3d 模型加载到半边数据结构网格中。 抱歉问了这么大的问题,我很冗长,我想确保我列出了所有的细节。因此,我将立即重申我的最终目标,以
我正在进入 .ply 文件的世界。我已经阅读了一些关于它们的内容,但是关于它们的格式的文档似乎与我的文件中的内容不太一致。我一直在尝试理解这篇文章 here,但我运气不佳。 这是我的 .ply 文件的
出于某种目的,我需要读取带有嵌入纹理的 PLY 文件(斯坦福三角格式)。我看到了 PLY 文件的几个规范,但找不到指定纹理映射语法的单个来源。似乎有很多库可以读取 PLY 文件,但大多数库似乎不支持纹
我使用 ply 作为我的 lex 解析器。我的规范如下: t_WHILE = r'while' t_THEN = r'then' t_ID = r'[a-zA-Z_][a-zA-Z0-9_]*'
我使用 ply 解析数据.我尝试使用空格作为词素的一部分。这里有一个简化的例子: from ply.lex import lex from ply.yacc import yacc tokens =
我是一名优秀的程序员,十分优秀!