首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pyparsing语法分析中调试infix语法的问题

在pyparsing语法分析中调试infix语法的问题
EN

Stack Overflow用户
提问于 2018-11-15 21:49:29
回答 1查看 93关注 0票数 1

我编写这个脚本是为了用类似于prolog的语法解析语句,将连接词视为具有优先级的操作符:

代码语言:javascript
复制
import pyparsing as pyp

alphabet = "abcdefghijklmnopqrstuvwxyz"
alphabet = alphabet + alphabet.upper()

symbol = pyp.Word(alphabet)

predicate = symbol + "(" + pyp.ZeroOrMore(symbol + ",") + symbol + ")"

parenthetic = pyp.Forward()

pyp_formula = pyp.infixNotation((predicate | parenthetic),
       [
           (pyp.oneOf('~'), 1, pyp.opAssoc.RIGHT),
           (pyp.oneOf(','), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf(';'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf('::'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf('->'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf(':-'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf('--'), 1, pyp.opAssoc.LEFT),
           (pyp.oneOf('.'), 1, pyp.opAssoc.LEFT),
       ])

parenthetic << "(" + pyp_formula + ")"

当我跑的时候

代码语言:javascript
复制
parse = pyp_formula.parseString('d(A, D), e(D) :- f(A), g(D); h(D).')

parse_list = formula_parse.asList()

print(parse_list)

我得到,"d(A,D),e(D)“甚至没有被分成两个谓词,"f(A),g(D);h(D)”被视为非终端中的单个终端。

代码语言:javascript
复制
[[[['d', '(', 'A', ',', 'D', ')', ',', 'e', '(', 'D', ')'],
':-', [['f', '(', 'A', ')', ',', 'g', '(', 'D', ')'],
';', 'h', '(', 'D', ')']], '.']]

我尝试过几种替代方法,但我似乎无法得到正确的解析。

欢迎任何帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-16 04:01:42

没有必要定义parentheticinfixNotation是为您定义的。如果您pyp.Group您的predicate表达式,那么符号和符号args将为您分组。吡咯烷酮还提供了delimitedList助手,作为expr, expr, expr的捷径:使用pyp.delimitedList(expr)。默认分隔符为“,”,但可以定义其他分隔符。最后,使用这么长的运算符列表,您可能会在任何非平凡的解析中遇到性能问题--添加对ParserElement.enablePackrat()的调用以打开内部解析缓存。

下面是您的代码在这些更改中的外观:

代码语言:javascript
复制
import pyparsing as pyp
pyp.ParserElement.enablePackrat()

alphabet = "abcdefghijklmnopqrstuvwxyz"
alphabet = alphabet + alphabet.upper()

symbol = pyp.Word(alphabet)

predicate = pyp.Group(symbol + "(" + pyp.delimitedList(symbol) + ")")

pyp_formula = pyp.infixNotation(predicate,
       [
           (pyp.oneOf('~'), 1, pyp.opAssoc.RIGHT),
           (pyp.oneOf(','), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf(';'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf('::'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf('->'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf(':-'), 2, pyp.opAssoc.LEFT),
           (pyp.oneOf('--'), 1, pyp.opAssoc.LEFT),
           (pyp.oneOf('.'), 1, pyp.opAssoc.LEFT),
       ])

pyp_formula.runTests(
    '''
    d(A, D) -> h(D).
    d(A, D), e(D) :- f(A), g(D); h(D).
    '''
    )

其结果是:

代码语言:javascript
复制
d(A, D) -> h(D).
[[[['d', '(', 'A', 'D', ')'], '->', ['h', '(', 'D', ')']], '.']]
[0]:
  [[['d', '(', 'A', 'D', ')'], '->', ['h', '(', 'D', ')']], '.']
  [0]:
    [['d', '(', 'A', 'D', ')'], '->', ['h', '(', 'D', ')']]
    [0]:
      ['d', '(', 'A', 'D', ')']
    [1]:
      ->
    [2]:
      ['h', '(', 'D', ')']
  [1]:
    .


d(A, D), e(D) :- f(A), g(D); h(D).
[[[[['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']], ':-', [[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]], '.']]
[0]:
  [[[['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']], ':-', [[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]], '.']
  [0]:
    [[['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']], ':-', [[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]]
    [0]:
      [['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']]
      [0]:
        ['d', '(', 'A', 'D', ')']
      [1]:
        ,
      [2]:
        ['e', '(', 'D', ')']
    [1]:
      :-
    [2]:
      [[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]
      [0]:
        [['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']]
        [0]:
          ['f', '(', 'A', ')']
        [1]:
          ,
        [2]:
          ['g', '(', 'D', ')']
      [1]:
        ;
      [2]:
        ['h', '(', 'D', ')']
  [1]:
    .
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53328371

复制
相关文章

相似问题

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