Бизон: Как решить проблему уменьшения / уменьшения Varname & Varname? - PullRequest
0 голосов
/ 27 ноября 2010

Допустим, вы пишете язык, похожий на C ++, и разрешаете ссылки

int& i

Вы также допускаете побитовое и

7&5

Как вы решаете уменьшить / уменьшить конфликты? Я не имею в виду использовать glr-parser, но не имею никаких конфликтов. Пример синтаксической проблемы:

var&var //could be type& var or logical val & val

Ответы [ 2 ]

2 голосов
/ 27 ноября 2010

Вы различаете последовательность грамматических терминов:

<type> & <identifier>

и

<identifier> & <identifier>

хотя в последнем случае вы, вероятно, действительно имеете дело с:

<expression> & <expression>

или подобная конструкция, где '<expression>' заканчивается как целые литералы или простые имена переменных.

Для этого может потребоваться семантическая обратная связь с лексическим анализатором - он должен уметь распознавать, что int (в примере) является именем типа (ключевым словом), а не общим идентификатором, но его также необходимо указать об именах typedef, чтобы их можно было также рассматривать как типы. Помните, однако, что имена typedef, как правило, ограничены.

0 голосов
/ 21 декабря 2010

Вы можете сказать flex, чтобы он возвращал другой токен для литерала & в зависимости от того, что было "лексировано" ранее.Таким образом, вы получите два правила:

<type> T_AMPERSAND <identifier>

и

<expression> T_LOGIC_AND <expression>

Если ваш новый язык поддерживает пользовательские типы, лексер не будет знать, нашел ли он только что <type> или <identifier>, хотя.В этом случае вы можете убедиться, что <type> '&' <identifier> считается допустимым автономным оператором, тогда как <expression> '&' <expression> может отображаться только как значение (справа от назначения).

...