Как я могу потерпеть неудачу при первой синтаксической ошибке в синтаксическом анализаторе, сгенерированном python ANTLR, при сохранении сообщения об ошибке? - PullRequest
0 голосов
/ 17 февраля 2020

Я использую antlr.error.ErrorStrategy.BailErrorStrategy для моего парсера. Иногда (в зависимости от ввода) он сообщает отчетливую версию синтаксической ошибки (например, line 2:3: mismatched input XXX expecting YYY), а иногда - нет (только исключение без line 2:3: some message):

import pytest
import json
import sys
from antlr4 import *
from antlr4.error.ErrorStrategy import DefaultErrorStrategy, BailErrorStrategy

from sqliteparser.SQLiteLexer import SQLiteLexer
from sqliteparser.SQLiteParser import SQLiteParser


def test_create_table():
    input_stream = InputStream("\nCREATE OR REPLACE VIEW APPDELETIONS as (\n")
    lexer = SQLiteLexer(input_stream)
    def recover(self,re):
        raise re
    lexer.recover = recover
    stream = CommonTokenStream(lexer)
    parser = SQLiteParser(stream)
    parser._errHandler = BailErrorStrategy()
    tree = parser.parse()

Есть ли способ получить стратегию ошибки, которая всегда сообщает текстовое представление синтаксической ошибки?

1 Ответ

0 голосов
/ 17 февраля 2020

Можно создать подкласс BailErrorStrategy и вызвать reportError:

class MyErrorStrategy(BailErrorStrategy):
    def recover(self, recognizer:Parser, e:RecognitionException):
        recognizer._errHandler.reportError(recognizer,e)
        super().recover(recognizer,e)

, затем просто позвонить parser._errHandler = MyErrorStrategy().

Это обеспечит вывод на консоль фактической синтаксической ошибки (например, line 2:18 mismatched input 'VIEW' expecting K_TABLE). Вы можете добавить других слушателей ошибок через parser.addErrorListener(...).

...