【问题标题】:Need help starting with Tatsu to parse grammar需要帮助从 Tatsu 开始解析语法
【发布时间】:2019-07-15 21:17:01
【问题描述】:

我收到 Tatsu 错误

“tatsu.exceptions.FailedExpectingEndOfText: (1:1) 期望文本结束”

使用我提供的语法运行测试 - 不清楚问题出在哪里。

本质上,调用解析器的语句是:

ast = parse(GRAMMAR, '(instance ?FIFI Dog)')

整个python文件如下:

GRAMMAR = """

@@grammar::SUOKIF

KIF      = {KIFexpression}* $ ;

WHITESPACE = /\s+/ ;
StringLiteral = /['"'][A-Za-z]+['"']/ ;
NumericLiteral = /[0-9]+/ ;
Identifier = /[A-Za-z]+/ ;
LPAREN = "(" ;
RPAREN = ")" ;
QUESTION = "?" ;
MENTION = "@" ;
EQUALS = "=" ;
RARROW = ">" ;
LARROW = "<" ;
NOT = "not"|"NOT" ;
OR = "or"|"OR" ;
AND = "and"|"AND" ;
FORALL = "forall"|"FORALL" ;
EXISTS = "exists"|"EXISTS" ;
STRINGLITERAL = {StringLiteral} ;
NUMERICLITERAL = {NumericLiteral} ;
IDENTIFIER = {Identifier} ;

KIFexpression
     = Word
       | Variable
       | String
       | Number
       | Sentence
       ;

Sentence = Equation
       | RelSent
       | LogicSent
       | QuantSent
       ;

LogicSent
     = Negation
       | Disjunction
       | Conjunction
       | Implication
       | Equivalence
       ;

QuantSent
     = UniversalSent
       | ExistentialSent
       ;

Word     = IDENTIFIER ;

Variable = ( QUESTION | MENTION ) IDENTIFIER ;

String   = STRINGLITERAL ;

Number   = NUMERICLITERAL ;

ArgumentList
     = {KIFexpression}*
     ;

VariableList
     = {Variable}+
     ;

Equation = LPAREN EQUALS KIFexpression KIFexpression RPAREN ;

RelSent  = LPAREN ( Variable | Word ) ArgumentList RPAREN ;

Negation = LPAREN NOT KIFexpression RPAREN ;

Disjunction
     = LPAREN OR ArgumentList RPAREN
     ;

Conjunction
     = LPAREN AND ArgumentList RPAREN
     ;

Implication
     = LPAREN EQUALS RARROW KIFexpression KIFexpression RPAREN
     ;

Equivalence
     = LPAREN LARROW EQUALS RARROW KIFexpression KIFexpression RPAREN
     ;

UniversalSent
     = LPAREN FORALL LPAREN VariableList RPAREN KIFexpression RPAREN
     ;

ExistentialSent
     = LPAREN EXISTS LPAREN VariableList RPAREN KIFexpression RPAREN
     ;

"""

if __name__ == '__main__':
    import pprint
    import json
    from tatsu import parse
    from tatsu.util import asjson

    ast = parse(GRAMMAR, '(instance ?FIFI Dog)')
    print('# PPRINT')
    pprint.pprint(ast, indent=2, width=20)
    print()

    print('# JSON')
    print(json.dumps(asjson(ast), indent=2))
    print()

谁能帮我解决一下?

谢谢。

科林·戈德堡

【问题讨论】:

    标签: tatsu


    【解决方案1】:

    您需要将“开始”符号的名称传递给parse()

    你也可以定义:

    start = KIF ;
    

    在语法中。

    【讨论】:

    • 我添加了“start = KIF ;”但这没有任何区别。我仍然收到错误:tatsu.exceptions.FailedExpectingEndOfText: (1:1) Expecting end of text : (instance ?FIFI Dog) ^
    【解决方案2】:

    我发现这个语法有两个问题。

    正如man pages 中所写,以大写字符开头的规则名称具有特殊含义。将所有规则名称更改为小写。

    另外让我们回顾一下IDENTIFIER 规则:

    IDENTIFIER = {Identifier} ;
    

    这意味着标识符可以被多次使用,或者可能完全丢失。通过直接定义IDENTIFIER来移除闭包:

    IDENTIFIER = /[A-Za-z]+/ ;
    

    您可以对NUMERICLITERALSTRINGLITERAL 执行相同的操作。

    当我执行这些步骤时,可以解析表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2011-08-15
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      相关资源
      最近更新 更多