ID : [getDataDB];
Это означает, что ID
соответствует одной букве, которая может быть любой из g, e, t, D, a или B. То, что вы, вероятно, хотели, это ID: 'getDataDB';
, который соответствует строке getDataDB
. Обратите внимание, что называть это ID
очень вводящим в заблуждение.
где я могу поставить код для этой функции
Вы пишете переводчиком с помощью посетителя? Затем вы поместите код в метод visitFunction
или, скорее, в метод getDataDB
, который вы вызываете из visitFunction
, если имя функции будет равно getDataDB
(сейчас это всегда будет так, но я Я полагаю, вы в конечном итоге хотите ввести более одной функции).
В качестве альтернативы вы можете также немного по-другому структурировать свою грамматику (убрав правило идентификатора):
function : 'getDataDB' # GetDataDB
| 'otherFunction' # OtherFunction
;
Тогда вы можете определить функции в visitGetDataDB
и visitOtherFunction
соответственно.
Все это предполагает, что вы хотите, чтобы имена функций были ключевыми словами (что подразумевает, что не может быть определяемых пользователем функций). Если вы этого не сделаете, у вас не должно быть отдельных токенов для имен функций, поэтому функции и переменные с нулевым аргументом становятся неразличимыми синтаксически (если только вы не добавите требование добавить ()
для функций, но это не похоже на то, что вы хочу). Таким образом, у вас должно быть только одно правило, которое может быть либо переменной, либо функцией с нулевым аргументом, а затем проверить, является ли данный идентификатор именем функции в visitVariableOrNullaryFunction
(для краткости, возможно, вы просто вызовете visitVariable
) .