我收到一个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()有人能帮我解决这个问题吗?
谢谢。
科林·戈德堡
发布于 2019-02-26 00:43:11
您需要将"start“符号的名称传递给parse()。
您还可以定义:
start = KIF ;在语法上。
发布于 2020-12-26 07:48:58
我可以看到这种语法有两个问题。
正如在man pages中所写的,以大写字符开头的规则名称具有特殊含义。将所有规则名称更改为小写。
另外,让我们回顾一下IDENTIFIER规则:
IDENTIFIER = {Identifier} ;这意味着标识符可以多次使用,或者根本不存在。通过直接定义IDENTIFIER来移除闭包:
IDENTIFIER = /[A-Za-z]+/ ;您可以对NUMERICLITERAL和STRINGLITERAL执行相同的操作。
当我执行这些步骤时,表达式可以被解析。
https://stackoverflow.com/questions/54815885
复制相似问题