2013-03-27 1 views
0

Я делаю простой калькулятор, используя flex, bison.Bison - обработка не LALR (1) grammars

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

Грамматика похожа на это:

exp -> intExp | realExp 

intExp -> INT | intExp '+' intExp 

realExp -> REAL | realExp '+' realExp | intExp '+' realExp | realExp '+' intExp 

Это не LALR (1).

Например, рассмотрим строку INT '+' REAL. В «INT» lookahead есть «+», и на основе этого невозможно определить, является ли строка intExp или realExp.

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

Я знаю, что могу отложить вычисления при разборе и вместо этого построить дерево синтаксического разбора. Затем с проверкой типов проблема может быть решена. Но это слишком сложно для такой простой проблемы.

Есть ли какой-либо способ бизона, чтобы справиться с этой двусмысленностью? Или грамматика может быть переписана лучше?

ответ

2

Нет, если это не LALR (1), то это не так. Однако на вашем языке вы не можете иметь ошибку несоответствия типа. Почему же тогда есть отдельные постановки для int и реальных выражений? Просто сделайте значение узла, содержащее целое число, реальный и код типа.

+0

Я действительно не хотел попасть в создание узлов .... прямо сейчас я просто использовал зубров для оценки выражения Отдельные постановки нужны из-за большей точности длинного длинного (INT), чем длинного двойного (REAL) –

+0

Это не то, что я имел в виду. В любом случае, ваши творения имеют значение, не так ли? Просто объявите структуру и используйте бизон для производственных значений. –

+0

получил это ... спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^