Разбор теста с множественным выбором с Lark - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь разобрать тест с несколькими вариантами ответов с помощью lark, используя следующую грамматику.


    GRAMMAR = """
        start: question choice~3..5

        question: QUESTION_NUMBER _QUESTION_NUMBER_SEPARATOR question_body
        question_body:  LINE+ 
        QUESTION_NUMBER: DIGIT+ 
        _QUESTION_NUMBER_SEPARATOR: WS_INLINE* "." WS_INLINE*

        choice.3: CHOICE_NAME ")" choice_body
        choice_body: LINE+
        CHOICE_NAME.3: ("A" | "B" | "C" | "D" | "E")

        LINE: (WORD | PUNCTUATION | WS_INLINE )* NEWLINE 
        WORD: (LETTER | DIGIT | /[şŞöÖüÜçÇğĞıİâî]/)+
        PUNCTUATION: (SEPARATOR | GROUPER | MATHS | OTHER)
        SEPARATOR: ("," | "." | ":" | ";" | "?" | "!"| "-")
        GROUPER: ("<" | ">" | "[" | "]" | "(" | ")" )
        MATHS: ("–" | "+" | "/" | "=" | "÷")
        OTHER: /["'_\\\]/

        _EOL : WS_INLINE* _NL
        _NL : (NEWLINE | /\f/)

        %import common.NEWLINE
        %import common.LETTER
        %import common.DIGIT
        %import common.WS_INLINE
    """

    parser = lark.Lark(
            GRAMMAR,
            parser="lalr",
            lexer="contextual",
            keep_all_tokens=False,
            debug=True,
        )


Вопросы аналогичны следующему примеру:

1. This is a section of question body.

Another part of the question body.  

A) Option A
B) Option B
C) Option C
D) Option D
E) Option E 

Как тело вопроса, так и тела выбора могут содержать несколько строк, а также пустые строки.

Я получаю следующую ошибку при запуске кода:

lark.exceptions.UnexpectedCharacters: No terminal defined for 'n' at line 3 col 2
Another part of the question body.
 ^
Expecting: {'RPAR'}

По-видимому, анализатор пытается обработать этот раздел, как если бы он был выбором, и завершается ошибкой из-за несоответствия ")", которое должно иметьпришел после А.

Порядок выбора не имеет значения, например, следующий также не выполняется по той же причине.

 1. This is a section of question body.

Be a part of the question body.  

A) Option A
B) Option B
C) Option C
D) Option D
E) Option E 

выдает ту же ошибку:

lark.exceptions.UnexpectedCharacters: No terminal defined for 'e' at line 3 col 2
Be a part of the question body.
 ^
Expecting: {'RPAR'}

Но любая строка, которая не начинается с "ABCDE", успешно анализируется как часть тела вопроса.Например, это работает:

 1. This is a section of question body.

Second part of the question body.  

A) Option A
B) Option B
C) Option C
D) Option D
E) Option E 

# program's output is as  
{
    "question": {
        "body": "This is a section of question body.\n\nSecond part of the question body.  \n\n",
        "number": "1",
    },
    "choices": (
        {"name": "A", "body": " Option A\n"},
        {"name": "B", "body": " Option B\n"},
        {"name": "C", "body": "Option C\n"},
        {"name": "D", "body": " Option D\n"},
        {"name": "E", "body": "Option E \n\n"},
    ),
}

Что я делаю неправильно в грамматике?

...