1

我正在将云雀解析器与 python 一起使用。我想使用 EOL 作为语法的一部分,因为它是面向行的。当我尝试将正则表达式放入匹配 EOL 时出现错误。我看到一些这样的例子:

CR : /\r/
LF : /\n/
NEWLINE: (CR? LF)+

但他们不适合我。这是我的代码:

import sys
import lark

class Parser:
    grammar = '''
        start : STRING EOL
        STRING : /\w+/
        EOL : /\n/x
    '''

    parser = lark.Lark(grammar)

    def __init__(self, fname):
        self.fname = fname
        self.ast(open(fname))

    def ast(self, fh):
        tree = self.parser.parse(fh.read())
        print(tree.pretty())

def main():
    x = Parser(sys.argv[1])

main()

这是我得到的错误:

Traceback (most recent call last):
  File "./p2.py", line 6, in <module>
    class Parser:
  File "./p2.py", line 13, in Parser
    parser = lark.Lark(grammar)
  File "/grid/common/pkgs/python/v3.7.2/lib/python3.7/site-packages/lark/lark.py", line 413, in __init__
    self.parser = self._build_parser()
  File "/grid/common/pkgs/python/v3.7.2/lib/python3.7/site-packages/lark/lark.py", line 456, in _build_parser
    return parser_class(self.lexer_conf, parser_conf, options=self.options)
  File "/grid/common/pkgs/python/v3.7.2/lib/python3.7/site-packages/lark/parser_frontends.py", line 242, in __call__
    return ParsingFrontend(lexer_conf, parser_conf, options)
  File "/grid/common/pkgs/python/v3.7.2/lib/python3.7/site-packages/lark/parser_frontends.py", line 61, in __init__
    self.parser = create_parser(lexer_conf, parser_conf, options)
  File "/grid/common/pkgs/python/v3.7.2/lib/python3.7/site-packages/lark/parser_frontends.py", line 209, in create_earley_parser
    return f(lexer_conf, parser_conf, options, resolve_ambiguity=resolve_ambiguity, debug=debug, tree_class=tree_class, **extra)
  File "/grid/common/pkgs/python/v3.7.2/lib/python3.7/site-packages/lark/parser_frontends.py", line 186, in create_earley_parser__dynamic
    earley_matcher = EarleyRegexpMatcher(lexer_conf)
  File "/grid/common/pkgs/python/v3.7.2/lib/python3.7/site-packages/lark/parser_frontends.py", line 172, in __init__
    raise GrammarError("Dynamic Earley doesn't allow zero-width regexps", t)
lark.exceptions.GrammarError: ("Dynamic Earley doesn't allow zero-width regexps", TerminalDef('EOL', '(?x:\n)'))
4

1 回答 1

1

我忘记了需要使用原始字符串。必须添加一个“r”。新代码如下所示:

class Parser:
    grammar = r'''
        start : STRING EOL
        STRING : /\w+/
        EOL : /\n/
    '''
于 2022-02-05T21:54:55.160 回答