Обработка пробелов в грако при использовании регулярных выражений
Я пытаюсь написать грамматику ebnf со вкусом грако. Я заметил, что сгенерированный синтаксический анализатор, по-видимому, не перемещается по пробелам или комментариям при попытке проанализировать регулярное выражение.
Документация говорит следующее по этой теме
В отличие от других выражений, это не продвигается над пробелами или комментариями. Для этого поместите регулярное выражение в качестве единственного термина в своем собственном правиле.
Затем я создал простую грамматику с одним правилом регулярных выражений. Регулярное выражение также является единственным термином в этом правиле.
@@eol_comments :: ?/(#[^\r\n]*)|(\/\/[^\r\n]*)/?
@@comments :: ?/\s*\/\*(.|[\r\n])*?\*\//?
Start = NameList $;
NameList = { Name } ;
Name = /[a-zA-Z_][a-zA-Z0-9_]+/ ;
Сгенерированный синтаксический анализатор не работает на входах "abc \ ndef" и "abc \ ndef". Первый в самом начале, второй на первой новой строке, пробел или комментарий.
Это происходит только с регулярными выражениями, другие правила работают нормально, например, если имя определено как
Name = 'abc' | 'def' ;
Тогда все в порядке и вышеупомянутые входные данные успешно анализируются.
Как я могу изменить поведение так, чтобы грамматика опережала пробелы и комментарии?
Дополнительная информация:
следы вышеуказанных входов:
<Start
<1:1>abc
<NameList<Start
<1:1>abc
<Name<NameList<Start
<1:1>abc
>'abc' /[a-zA-Z_][a-zA-Z0-9_]+/
<1:4>
>Name<NameList<Start
<1:4>
<Name<NameList<Start
<1:4>
!'' /[a-zA-Z_][a-zA-Z0-9_]+/
<1:4>
>NameList<Start
<1:4>
!Start
<1:1>abc
а также
<Start
<1:1> abc
<NameList<Start
<1:1> abc
<Name<NameList<Start
<1:1> abc
!'' /[a-zA-Z_][a-zA-Z0-9_]+/
<1:1> abc
>NameList<Start
<1:1> abc
!Start
<1:1> abc
Я сгенерировал парсер с помощью следующей команды:
grako --generate-parser --outfile parser.py test.ebnf
и я также попытался указать пробелы с помощью опции -w (/\s+/ и /[ \t\n\r]+/, но это не изменило поведение)
И запустил парсер с помощью:
python parser.py eztest.txt Start -t
1 ответ
Имена правил, которые начинаются с заглавной буквы, специально для Grako. Как объясняется в документации, они не пересекают пробелы перед началом анализа.
Измените имена правил в вашей грамматике, чтобы они начинались со строчной буквы, и это должно быть хорошо.
Почему бы не оставить выбор имен правил верблюжьих или в стиле Python пользователю?
- Это был простой и легкий в реализации выбор дизайна, обеспечивающий большую гибкость в отношении лексических аспектов языка.
- Ожидалось, что программистам на Python будет удобно с именами в стиле Python
- В компьютеризированных грамматиках и парсерах существует традиция использовать строчные буквы для имен правил