Анализатор выражений вычислений с вложенностью и переменными в ActionScript - PullRequest
0 голосов
/ 13 марта 2010

Я пытаюсь включить динамические поля в файле конфигурации для моего картографического приложения, но я не могу понять, как проанализировать «уравнение», переданное пользователем, по крайней мере, без написания целого парсера с нуля ! Я уверен, что есть более простой способ сделать это, и поэтому я прошу идеи!

Основная идея:

public var testString:String = "(#TOTPOP_CY#-#HISPOP_CY#)/#TOTPOP_CY#";
public var valueObject:Object = {TOTPOP_CY:1000, HISPOP_CY:100};
public function calcParse(eq:String):String {
// do calculations
return calculatedValue
}

До сих пор я думал о разделении выражения либо по операторам, либо, может быть, по переменным токенам, но это избавляет от вложенности в скобках. В качестве альтернативы используйте серию регулярных выражений для поиска и замены каждого фрагмента выражения его значением, рекурсивно работая до тех пор, пока не останется только число. Но я не думаю, что регулярное выражение делает математику (то есть замените "\ d + \ d" на сумму двух чисел) В идеале, я бы просто сделал поиск / замену всех имен переменных их значениями, а затем запустил eval (), но в AS нет eval ...

eesh

Я скачал некоторые материалы курса для курса по дизайну компилятора, поэтому, возможно, я просто напишу полноценный язык калькулятора и парсер и перенесу его из OTHER flex (генератор парсера): -D

1 Ответ

2 голосов
/ 13 марта 2010

Во-первых, это не проблема регулярных выражений.

Далее, если вы хотите использовать генератор компилятора в as3, не используйте flex. Используйте ANTLR, он может нацеливаться на AS3 для вывода (нет необходимости переносить его из C) (http://www.antlr.org)

Наконец, ознакомьтесь с алгоритмами преобразования из инфикса в постфикс. Вот статья в Википедии об этом. (http://en.wikipedia.org/wiki/Shunting-yard_algorithm) Это не слишком сложно для реализации.

...