- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在试验 lark ,但遇到了一个小问题。假设我有以下语法。
parser = Lark('''
?start: value
| start "or" value -> or
?value: DIGIT -> digit
| ID -> id
DIGIT: /[1-9]\d*/
%import common.CNAME -> ID
%import common.WS
%ignore WS
''', parser='lalr')
假设我想解析 1orfoo
:
print(parser.parse("1orfoo").pretty())
我希望 lark 将其视为数字 1
后跟标识符 orfoo
(因此抛出错误,因为语法不接受这种表达式)。
但是,解析器运行时没有错误并输出:
or
digit 1
id foo
如您所见,lark 将标识符拆分并将表达式视为 或
语句。
为什么会这样?我错过了什么吗?我怎样才能防止这种行为?
提前谢谢你。
最佳答案
Lark 可以使用不同的词法分析器将输入文本结构化为标记。默认值为“auto”,它根据解析器选择词法分析器。对于 LALR,选择“上下文”词法分析器 ( reference )。上下文词法分析器使用 LALR 前瞻来丢弃不符合语法的标记选择(reference):
The contextual lexer communicates with the parser, and uses the parser's lookahead prediction to narrow its choice of tokens. So at each point, the lexer only matches the subgroup of terminals that are legal at that parser state, instead of all of the terminals. It’s surprisingly effective at resolving common terminal collisions, and allows to parse languages that LALR(1) was previously incapable of parsing.
在您的代码中,由于您使用了 lalr
解析器,因此使用了 contextual
词法分析器。词法分析器首先为 1
创建一个 DIGIT
标记。接下来,词法分析器必须决定是为 or
文字创建一个标记,还是为 ID
标记创建一个标记。由于解析状态不需要 ID
标记,词法分析器消除了后者的选择并标记了 or
。
要更改此行为,您可以改为选择标准
词法分析器:
parser = Lark('''...''', parser='lalr', lexer='standard')
在您的示例中,它将生成:
lark.exceptions.UnexpectedToken: Unexpected token Token(ID, 'orfoo') at line 1, column 2.
Expected one of:
* OR
* $END
关于python - 如何防止 lark 将标识符的一部分识别为关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61711950/
我一直在试验 lark ,但遇到了一个小问题。假设我有以下语法。 parser = Lark(''' ?start: value | start "or" value
我正在尝试编写一个 SMTP 解析器,并从 rfc 中获取一些引用字符串的信息。 .所以我有以下语法(取出所有有效的部分,关注无效的部分): quoted_string : /[\x22]/ qco
我的语法有一个优先级问题,我没有更多的想法来解决它。 我正在使用 Lark 事情是这样的(我已经尽可能地简化了问题): from lark import Lark parser = Lark(r"""
我正在尝试解析我正在编写的一些伪代码,但在获取符号值时遇到了一些问题。它解析成功,但不会返回与“常规”字符相同的值。这是一个例子: >>> from lark import Lark >>> pars
我正在为 rules_scala 实现类似 Strict Java Deps 的功能。 如果使用 warn 或 error,我真的很想能够在运行时进行配置。 我似乎记得 skylark 规则无法创建和
让我们首先考虑使用 lark 的简单 json 解析器: import sys from lark import Lark, Transformer, v_args json_grammar = r"
假设我有以下内容: items : (item separator)+ 这适用于: i1, i2, i3, 但不适用于: i1, i2, i3 如何做到不需要结尾分隔符? 最佳答案 这看起来更像是您需
我正在使用 lark,一个优秀的 python parsing library . 它提供了 Earley 和 LALR(1) 解析器,并通过 custom EBNF format 定义。 . (EB
如何实现可以导入文件并仍然使用 LARK 解析它的语法? 例如: @import file.txt ..... 最佳答案 我找到了一个看起来相关的 GitHub,这就是您要找的吗? https://g
考虑 Python Lark parser 的这个简单测试: GRAMMAR = ''' start: container* container: string ":" "{" (container
我正在尝试使用 lark 实现记录定义 DSL .它基于缩进,这让事情变得有点复杂。 Lark 是一个很棒的工具,但我遇到了一些困难。 这是我正在实现的 DSL 的一个片段: record Order
Lark 解析器预定义了一些常见的终端,包括一个字符串。它的定义如下: _STRING_INNER: /.*?/ _STRING_ESC_INNER: _STRING_INNER /(?
我正在尝试为 dsl 编写 lark 语法,但在使用此字符串插值语法时遇到了问题: " abc " <- normal string " xyz~{expression}abc " <- string
我在运行 checkov 时遇到一些问题,我不熟悉 python 库,任何人都可以给我一些提示吗? 这在某些机器上运行良好,但在这台机器上尤其不行...... 在 CentOS 中运行: $ chec
我已经编写了cs143 course中指定的decaf语法. 这是我的代码。 import sys from lark import Lark, Transformer, v_args decaf_g
我是一名优秀的程序员,十分优秀!