Я пытаюсь разобрать тест с несколькими вариантами ответов с помощью 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"},
),
}
Что я делаю неправильно в грамматике?