Нужна помощь, начиная с Тацу, чтобы разобрать грамматику
Я получаю ошибку Тацу
"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()
Может кто-нибудь помочь мне с исправлением?
Благодарю.
Колин Голдберг
2 ответа
Я вижу две проблемы с этой грамматикой.
Как написано на справочных страницах , имена правил, начинающиеся с символа верхнего регистра, имеют особое значение. Измените все имена правил на нижний регистр.
Также рассмотрим правило:
IDENTIFIER = {Identifier} ;
Это означает, что идентификатор может использоваться несколько раз, а может и вовсе отсутствовать. Удалите замыкание, определив
IDENTIFIER
напрямую:
IDENTIFIER = /[A-Za-z]+/ ;
Вы можете сделать то же самое для
NUMERICLITERAL
а также
STRINGLITERAL
.
Когда я сделал эти шаги, выражение можно было проанализировать.
Вам нужно передать имя символа "старт" parse()
,
Вы также можете определить:
start = KIF ;
в грамматике.