首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要从Tatsu开始解析语法的帮助

我需要从Tatsu开始解析语法的帮助
EN

Stack Overflow用户
提问于 2019-02-22 04:42:04
回答 2查看 164关注 0票数 0

我收到一个Tatsu错误

"tatsu.exceptions.FailedExpectingEndOfText:(1:1)应为文本结尾“

运行测试,使用我提供的语法-不清楚问题是什么。

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

代码语言:javascript
复制
ast = parse(GRAMMAR, '(instance ?FIFI Dog)')

整个python文件如下:

代码语言:javascript
复制
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()

有人能帮我解决这个问题吗?

谢谢。

科林·戈德堡

EN

回答 2

Stack Overflow用户

发布于 2019-02-26 00:43:11

您需要将"start“符号的名称传递给parse()

您还可以定义:

代码语言:javascript
复制
start = KIF ;

在语法上。

票数 0
EN

Stack Overflow用户

发布于 2020-12-26 07:48:58

我可以看到这种语法有两个问题。

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

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

代码语言:javascript
复制
IDENTIFIER = {Identifier} ;

这意味着标识符可以多次使用,或者根本不存在。通过直接定义IDENTIFIER来移除闭包:

代码语言:javascript
复制
IDENTIFIER = /[A-Za-z]+/ ;

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54815885

复制
相关文章

相似问题

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