Я пишу синтаксический анализатор запросов и в настоящее время сталкиваюсь с проблемой, которую я не видел в компиляторах языков программирования.
У меня следующий запрос:
status=acknowledged
И я ожидаю, что status
будет идентификатором переменной и acknowledged
будет строковым литералом. Единственный способ определить это - посмотреть на оператор =
между ними.
Теоретически сканер должен иметь возможность вернуть новый токен, не глядя на предыдущие, но если это так, как бы вы отличали guish идентификатор от строкового литерала? Помните, что я не могу просто добавить двойные кавычки вокруг строки acknowledged
, так как мне нужно работать с языком запросов, который уже существует, и я не могу вносить в него какие-либо изменения.
Если я просто следите за предыдущими N токенами внутри сканера и действуйте соответственно?
Все становится еще более запутанным, если у меня что-то вроде этого:
status=acknowledged&visibility=all
В этом случае и =
, и &
являются операторами, поэтому я не могу просто сказать, что если токен перед тем, который я сейчас анализирую, является оператором, я должен рассматривать это как строковый литерал.