Обработка пробелов в грако при использовании регулярных выражений

Я пытаюсь написать грамматику 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
  • В компьютеризированных грамматиках и парсерах существует традиция использовать строчные буквы для имен правил
Другие вопросы по тегам