С точки зрения алгоритма для анализа выражения вам нужен один стек.
Мы используем алгоритм двух шагов:
Цель лексинга состоит в том, чтобы получить «ключевые слова», «идентификаторы» и «разделители»: - ключевым словом является «if», а затем «else» ('') '' / \ '' / ' и т. д. - Идентификаторы в вашем случае - «A», «B», «C» и т. д. - разделитель - это пустое пространство, табуляция, конец строки, конец файла и т. д. ...
Лексинг состоит из использования автоматов. В лексике вы будете читать свой символ ввода char. Когда вы получаете символ, который совместим с одним из ваших ключевых слов, идентификаторов, разделителей, вы начинаете последовательность символов. Когда вы присоединяете разделители, вы останавливаете последовательность, посмотрите в словарной строке последовательности - это ключевое слово (если оно не является идентификатором); затем поместите кортеж [последовательность, ключевое слово или идентификатор / класс] в стек.
Я оставляю вас как упражнение в случае маленького ключевого слова '(', которое также можно увидеть как разделители.
Анализ аналогичен грамматике. В вашем случае единственными правилами для проверки являются запятая, двоичные операции и просто простой идентификатор.
] formy:
expression::
'(' expression ')'
expression /\ expression
expression \/ expression
identifier
Это может быть запись рекурсивной функцией. Сначала отмените свой стек, а затем:
myParseExpression(stack, myC#ResultObject)
{
if(stack.top = kewyord.'(' )
then myParseOpenComma(all stack but top, myC#ResultObject)
if(stack.top = keyword.'/\')
then myParseBinaryAnd(stack, myC#ResultObject)
}
myParseOpenComma(stack, myC#ResultObject)
{
...
}
myParseBinaryAnd(stack, myC#ResultObject)
{
myNewRigthPartOfExpr = new C#ResultObject
myParseExpression(stack.top, myNewRigthPartOfExpr)
remove top of stack;
myNewLeftPartOfExpr = new C#ResultObject
myParseExpression(stack.top, myNewLeftPartOfExpr)
C#ResultObject.add("AND", myNewRigthPartOfExpr, myNewLeftPartOfExpr)
}
...
Существует несколько функций, которые разделяют рекурсию друг на друга.
Аспект Thoses является основой компиляции программы. Кодирование thoses вещь улучшит вас много, потому что это тяжело и фундаментально.