Оценка логического выражения в строковом формате с операторами в качестве предопределенных переменных в Embedded C ++ - PullRequest
0 голосов
/ 04 мая 2020
  • В моей встроенной программе на C ++ у меня есть определенные предопределенные переменные, такие как int Var_A, Var_B, Var_ C, Var_D ....
  • Я должен определить логическое выражение во внешнем текстовом файле (Поскольку логические выражения настраиваются во внешнем текстовом файле, называемом файлом конфигурации), позже этот файл считывается в файловой системе микроконтроллера.
  • Переменные в файле конфигурации совпадают с переменными во встроенной программе.
  • Файл содержит логическое выражение в следующем предопределенном формате:

(Operand 1) (Operator) (Operator 2)

Пример: Var_A AND Var_B

  • переменные изменяются (во встроенной программе) во время выполнения.
  • Позже результат этого логического выражения используется для выполнения определенной подпрограммы.
  • Мы не можем использовать прерывания для той же операции, поскольку у нас есть 100 с. таких переменных.

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

Пожалуйста, предложите логическое решение для того же.

1 Ответ

0 голосов
/ 04 мая 2020

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

Лучшее решение, чтобы получить идеи с его помощью, - это провести некоторое тестирование с использованием Flex и Я. cc. Эти инструменты позволяют выполнять сканирование (Flex) и преобразовывать отсканированные строки в токены, которые анализатор (Ya cc) может преобразовать с помощью Context Free Grammer (CFG) в дерево узлов, которые кодируют уравнение. (Это очень похоже на то, как работают компиляторы)

Это позволяет вам делать следующее, если вы вводите следующее:

var1 + var2

Вы сканируете эту строку на наличие токенов, эти : var1<variable> +<operator> var2<variable>

Вы преобразуете эти токены в узлы дерева:

    node #1
    op: +
    operatorType: enumvalue for +
       |               |
      |                 |
     |                   |
    \/                   \/
node #2                node# #3
name: var1             name: var2
type: var              type: var

Теперь вы можете обходить дерево и использовать члены объектов в дереве, чтобы определить, что это такое и как его использовать.

Теперь сложная часть состоит в том, как вы собираетесь реализовать это в ограниченном встроенном устройстве. Если на вашем устройстве достаточно оперативной памяти, чтобы вместить достаточно большой буфер данных для этой древовидной структуры, это невозможно сделать. Мое решение состояло бы в том, чтобы выделить буфер для узлов моего дерева и буфер имен для переменных, что позволило бы использовать объем памяти c без фрагментации.

...