Написание правила разбора подоболочки на ANTLR - PullRequest
2 голосов
/ 20 января 2009

Я пытаюсь создать простую BaSH-подобную грамматику для ANTLRv3, но не смог разобрать (и проверить) ввод внутри команд subshell.

Дальнейшее объяснение:

Я хочу проанализировать следующий ввод:

$(command parameters*)

`command parameters`

"some text $(command parameters*)"

И сможете проверить его содержимое так же, как и при простом вводе, таком как: параметры команды.

т.е:.

При разборе генерируется дерево типа

(SUBSHELL (CMD command (PARAM parameters*)))
(токены в верхнем регистре)


Я могу игнорировать '$ (' и '`s, но это не будет охватывать случаи, когда подоболочки используются внутри строк в двойных кавычках, например:

$ echo "String test $(ls -l) end"

Итак ... какие-нибудь советы, как мне этого добиться?

1 Ответ

1 голос
/ 20 января 2009

Я не очень знаком с деталями Antlr v3, но могу вам сказать, что вы не можете обрабатывать подстановку команд в стиле bash внутри строк в двойных кавычках в лексере традиционного стиля, поскольку вложенность не может быть выражена используя обычную грамматику. Большинство традиционных компиляторов-компиляторов ограничивают использование лексерами регулярных грамматик, чтобы для них можно было создавать эффективные DFA. (Лексеры, которые неустранимо должны сканировать каждый отдельный символ источника, исторически были одной из самых медленных частей компилятора.)

Вы должны либо проанализировать "как токен, и (в идеале) использовать другой режим лексера или лексера для внутренних строк, так что большинство метасимволов оболочки, например '{', анализируются не как токены, а как текст; в качестве альтернативы, покончите с делением лексера-парсера и используйте подход без сканера, чтобы правило «лексера» для строк в двойных кавычках могло вызывать правило «парсера» для подстановок команд.

Я бы предпочел подход без сканера. Я хотел бы исследовать, насколько хорошо Antlr v3 поддерживает написание грамматик, которые работают непосредственно над потоком символов, а не с использованием потока токенов.

...