Как запретить пропуски между токенами? - PullRequest
0 голосов
/ 14 февраля 2019

В bash, в назначении не должно быть пробелов вокруг =.

x=10

bash's yylex() просто возвращает все x=10 как токен ASSIGNMENT_WORD.Затем выполните обработку.

http://git.savannah.gnu.org/cgit/bash.git/tree/parse.y#n723

Но лучше ли обрабатывать присвоение парсером, а не лексером (как большинство примеров об присваивании, которые я вижу, обрабатывают его в парсере)?

Как спроектировать грамматику, чтобы запретить пробелы вокруг =?Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

Но лучше ли обрабатывать присвоение парсером, а не лексером (как большинство примеров о присваивании, которое я вижу, обрабатывать его в парсере)?

Если пробел вообщеслужит для разделения лексических токенов, тогда, вероятно, легче избежать создания исключения для присвоения переменных.Обратите внимание, что в частном случае языка команд оболочки спецификации явно описывают синтаксический анализ в терминах лексической токенизации, выполненной таким образом, поэтому в этом случае особенно привлекательно написать ваш код так, чтобы он соответствовалнепосредственно к спецификациям.

Если вы сделаете это, то очень полезно также позволить лексеру распознавать назначения как их собственный тип токена, так как эта информация выпадает из лексического анализа довольно дешево, тогда как это будетболее сложным и более дорогим для этапа синтаксического анализа (пере) проверять каждое значение токена, чтобы распознать, какие назначения.

Как разработать грамматику, чтобы запретить пробелы вокруг =?

Если правила пробелов должны применяться на уровне грамматики, а не на уровне токенизации, то токенизатору необходимо выдавать явные токены пробелов, чтобы анализатор мог видеть, где пробелы.Затем вы можете написать правила грамматики, которые учитывают пропуски там, где это разрешено, а не там, где это не так.Но возьмите это у кого-то, кто сделал это (для другого языка): это уродливо и противно, и вы должны приложить все усилия, чтобы избежать этого.

...