Я работаю над проектом, в котором мне нужно перевести NetLogo на другой язык программирования. Я использую Boost Spirit и уже реализовал некоторые грамматики проекта, которые хранят простой синтаксис кода в AST.
Проблема, с которой я сталкиваюсь, заключается в том, что сейчас я не могу сказать, является ли идентификатор именем переменной или функции. Кроме того, я не знаю, нужен ли конкретному вызову функции один, два или несколько аргументов, поэтому я не знаю, когда прекратить искать другие аргументы.
Например, вызов функции может выглядеть как
id1 id2 id3 id4
Это может быть:
id3
- это функция, которая имеет id4
в качестве аргумента (скажем, возвращаемое значение id5
), а id1
- это функция, которая имеет id2
и id5
в качестве аргументов
Но это также может быть:
id1
имеет id2
id3
id4
в качестве аргументов (все, кроме id1
являются именами переменных)
Я думал об использовании символов и добавлении новых элементов при каждом объявлении переменной или функции, это поможет дифференцировать имена переменных и имена функций, но ...
- Как можно / нужно хранить количество аргументов, которое требуется функции для использования Boost Spirit? Может быть, использовать другую таблицу символов с семантическими действиями при разборе определения функции?
- Как только я знаю, как получить необходимое количество аргументов, как я могу получить это значение, когда найду идентификатор функции при синтаксическом анализе выражения?
- Это хорошее решение использовать символы для различения имен переменных от имен функций?