Вы хотите синтаксический анализатор с рекурсивным спуском .
Для получения приоритета необходимо думать рекурсивно, например, с помощью демонстрационной строки,
1+11*5
, чтобы сделать это вручную, необходимо было бы читать эти 1
, затем видеть плюс и запустить совершенно новый рекурсивный синтаксический анализ "сессия", запускающаяся с 11
... и удостовериться, что проанализировали 11 * 5
в его собственный фактор, приводя к дереву синтаксического анализа с 1 + (11 * 5)
.
это все чувства, настолько болезненные даже, чтобы попытаться объяснить, особенно с добавленной беспомощностью C. Посмотрите после парсинга этих 11, если бы * был на самом деле + то вместо этого, необходимо было бы отказаться от попытки создания термина и вместо этого проанализировать 11
самого как фактор. Моя голова уже взрывается. Это возможно с рекурсивной достойной стратегией, но существует лучший путь...
при использовании инструмента GPL как Бизон Вы, вероятно, не должны волноваться о лицензировании проблем, так как код C, сгенерированный бизоном, не покрыт GPL (IANAL, но я - вполне уверенные инструменты GPL, не вызывают GPL на сгенерированном коде/двоичных файлах; например, код компиляций Apple как говорит, Апертура с GCC, и они продают его, не имея необходимость к GPL, сказал код).
Бизон Загрузки (или что-то эквивалентное, ANTLR, и т.д.).
обычно существует некоторый пример кода, что можно просто работать на бизоне и получить желаемый код C, который демонстрирует эти четыре функциональных калькулятора:
http://www.gnu.org/software/bison/manual/html_node/Infix-Calc.html
Взгляд на сгенерированный код, и видит, что это не столь легко, как это звучит. Кроме того, преимущества использования инструмента как Бизон 1), Вы изучаете что-то (особенно, если Вы читаете, Дракон заказывают и узнают о грамматиках), 2) Вы избегаете NIH, пытающийся перестроить колесо. С реальным инструментом парсера-генератора у Вас на самом деле есть надежда при увеличении масштаба позже, показывая другим людям, Вы знаете, что синтаксические анализаторы являются доменом парсинга инструментов.
Обновление:
Люди здесь дали много разумного совета. Мое единственное предупреждение против пропуска инструментов парсинга или просто использования алгоритма Сортировочной станции или скрученного вручную рекурсивного достойного синтаксического анализатора состоит в том, что небольшие игрушечные языки 1 глоток> могут когда-нибудь превратиться в большие фактические языки с функциями (грех, потому что, журнал) и переменные, условия и для циклов.
Flex/бизон может быть излишеством для маленького, простого интерпретатора, но тот от parser+evaluator может доставить неприятности по линии, когда изменения должны быть внесены, или опции должны быть добавлены. Ваша ситуация будет варьироваться, и необходимо будет использовать решение; просто не делайте , наказывают других людей за Ваши грехи [2] глоток> и создают меньше, чем соответствующий инструмент.
Мой любимый инструмент для парсинга
лучший инструмент в мире для задания библиотека Parsec (для рекурсивных достойных синтаксических анализаторов), который идет с языком программирования Haskell. Это много походит BNF, или как некоторый специализированный инструмент или предметно-ориентированный язык для парсинга (примера кода [3]), но это - на самом деле просто обычная библиотека в Haskell, означая, что это компилирует на том же шаге сборки как остальная часть Вашего кода Haskell, и можно записать произвольный код Haskell и вызов, что в рамках синтаксического анализатора, и Вы можете смешивание и подгонка другие библиотеки все в том же коде . (Встраивание языка парсинга как это на языке кроме Haskell приводит к загрузкам синтаксического хлама, между прочим. Я сделал это в C#, и он работает вполне хорошо, но это не так симпатично и сжато.)
Примечания:
1 Richard Stallman говорит, в [1 116], Почему Вы не должны использовать Tcl
, который основной урок Emacs - то, что язык для расширений не должен быть простым "дополнительным языком". Это должен быть реальный язык программирования, разработанный для записи и поддержания существенных программ. Поскольку люди захотят сделать это!
[2] Да, я навсегда травмирован от использования того "языка".
Также примечание, что, когда я отправил эту запись, предварительный просмотр был корректен, но меньше SO, чем соответствующий синтаксический анализатор съели мой близкий тег привязки в первом абзаце , доказав, что синтаксические анализаторы не что-то, чтобы шутиться с тем, потому что при использовании regexes и один от взломов Вы, вероятно, получите что-то тонкое и маленькое, неправильное .
[3] Отрывок синтаксического анализатора Haskell с помощью Парсека: четыре функциональных калькулятора расширяются с помощью экспонент, круглых скобок, пробела для умножения и констант (как пи и e).
aexpr = expr `chainl1` toOp
expr = optChainl1 term addop (toScalar 0)
term = factor `chainl1` mulop
factor = sexpr `chainr1` powop
sexpr = parens aexpr
<|> scalar
<|> ident
powop = sym "^" >>= return . (B Pow)
<|> sym "^-" >>= return . (\x y -> B Pow x (B Sub (toScalar 0) y))
toOp = sym "->" >>= return . (B To)
mulop = sym "*" >>= return . (B Mul)
<|> sym "/" >>= return . (B Div)
<|> sym "%" >>= return . (B Mod)
<|> return . (B Mul)
addop = sym "+" >>= return . (B Add)
<|> sym "-" >>= return . (B Sub)
scalar = number >>= return . toScalar
ident = literal >>= return . Lit
parens p = do
lparen
result <- p
rparen
return result
Часто задаваемые вопросы о ppt - это хороший вариант для начала.
Хороший источник примеров
Если вы уже знаете свой путь, вы можете использовать msdn учебник
PowerPoint и VBA для PPTLive похоже на хорошее место для начала.