Я делаю простой калькулятор, используя 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.
Я попытался переписать грамматику, чтобы устранить двусмысленность, но из этого ничего не вышло.
Я знаю, что могу отложить вычисления при разборе и вместо этого построить дерево синтаксического разбора. Затем с проверкой типов проблема может быть решена. Но это слишком сложно для такой простой проблемы.
Есть ли какой-либо способ бизона, чтобы справиться с этой двусмысленностью? Или грамматика может быть переписана лучше?
Я действительно не хотел попасть в создание узлов .... прямо сейчас я просто использовал зубров для оценки выражения Отдельные постановки нужны из-за большей точности длинного длинного (INT), чем длинного двойного (REAL) –
Это не то, что я имел в виду. В любом случае, ваши творения имеют значение, не так ли? Просто объявите структуру и используйте бизон для производственных значений. –
получил это ... спасибо –