Мой аспирант и я работаем над учебным компилятором, который мы будем использовать для обучения студентов по предмету «Компиляторы и переводчики».
Входной программный язык является ограниченным подмножеством языка Java, а языком реализации компилятора является Java.
Грамматика синтаксиса языка ввода - LL (1), потому что это легче понять и реализовать студентам. У нас есть следующая общая проблема в реализации парсера. Как отличить идентификатор от вызова функции при разборе?
Например, мы можем иметь:
b = sum(10,5) //sum is a function call
или
b = a //a is an identifier
В обоих случаях после символа =
у нас есть идентификатор.
Можно ли дифференцировать, какой тип конструкции (вызов функции или идентификатор) мы имеем после символа равенства =
?
Может быть, это невозможно в парсере LL (1), так как мы можем смотреть только на 1 символ впереди? Если это правда, как вы рекомендуете определять вызов функции в грамматике? Может быть, необходим какой-то дополнительный символ перед вызовом функции, например, b = @sum(10,5)
?
Как вы думаете, этот символ будет сбивать с толку студентов? Какой символ для вызова функции будет правильным?