Вопрос о создании таблицы символов с помощью парсера yacc - PullRequest
1 голос
/ 26 ноября 2009

Если мой парсер yacc встречает следующий код:

int foo(int a, int b)

Должен ли он добавить int a и int b в качестве атрибутов foo? Как у меня сейчас, он вводит a и b как отдельные записи таблицы.

Ответы [ 2 ]

1 голос
/ 27 ноября 2009

Я бы добавил в таблицу символов отдельные записи, но на узле foo есть ограничительное предложение. Это позволит вам иметь возможность сообщать о затенении / маскировании переменных. Таким образом, для C вы можете определить глобальный модуль int a вверху, тогда наличие a в качестве параметра будет маскировать глобальное. Это полезная подсказка, которую вы можете дать пользователям в качестве предупреждения о нарушении соглашения о повторном объявлении символа в той же области действия.

В другом случае правилам области видимости может потребоваться блокировать повторно объявленный символ, например, вложенные в циклы, когда итератор имеет то же имя.

Как говорит Иван, вам нужно сделать этот вызов, основываясь на том, что вы хотите / нужно обнаружить, и на простейшем способе проверки.

0 голосов
/ 26 ноября 2009

Ваш вопрос довольно расплывчатый. Все зависит от того, что и как вы будете использовать в дальнейшем.

Вы можете использовать их как отдельные узлы в вашем AST или, как вы упомянули, вы можете добавить их в качестве атрибутов foo(). Я полагаю, что выбор в этом вопросе за вами.

...