Как отличить идентификатор от вызова функции в парсере LL (1) - PullRequest
0 голосов
/ 09 мая 2018

Мой аспирант и я работаем над учебным компилятором, который мы будем использовать для обучения студентов по предмету «Компиляторы и переводчики». Входной программный язык является ограниченным подмножеством языка 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)?

Как вы думаете, этот символ будет сбивать с толку студентов? Какой символ для вызова функции будет правильным?

1 Ответ

0 голосов
/ 09 мая 2018

Вы действительно не можете иметь отдельные правила для вызовов функций и переменных в грамматике LL (1), потому что это потребовало бы дополнительного просмотра.Общее решение этого состоит в том, чтобы объединить их в одно правило, которое соответствует идентификатору, за которым может следовать список аргументов:

primary_expression ::= ID ( "(" expression_list ")" )?
                     | ...

На языке, где функция может быть произвольным выражением, а не просто идентификатором,вы захотите обращаться с ним так же, как с любым другим постфиксным оператором:

postfix_expression ::= primary_expression postfix_operator*

postfix_operator ::= "++"
                   | "--"
                   | "[" expression "]"
                   | "(" expression_list ")"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...