доверенный Regex не работает в Powershell, почему [дубликаты]

С точки зрения алгоритма для анализа выражения вам нужен один стек.

Мы используем алгоритм двух шагов:

  1. Лексинг

Цель лексинга состоит в том, чтобы получить «ключевые слова», «идентификаторы» и «разделители»: - ключевым словом является «if», а затем «else» ('') '' / \ '' / ' и т. д. - Идентификаторы в вашем случае - «A», «B», «C» и т. д. - разделитель - это пустое пространство, табуляция, конец строки, конец файла и т. д. ...

Лексинг состоит из использования автоматов. В лексике вы будете читать свой символ ввода char. Когда вы получаете символ, который совместим с одним из ваших ключевых слов, идентификаторов, разделителей, вы начинаете последовательность символов. Когда вы присоединяете разделители, вы останавливаете последовательность, посмотрите в словарной строке последовательности - это ключевое слово (если оно не является идентификатором); затем поместите кортеж [последовательность, ключевое слово или идентификатор / класс] в стек.

Я оставляю вас как упражнение в случае маленького ключевого слова '(', которое также можно увидеть как разделители.

  1. Разбор

Анализ аналогичен грамматике. В вашем случае единственными правилами для проверки являются запятая, двоичные операции и просто простой идентификатор.

] 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)
}

...

Существует несколько функций, которые разделяют рекурсию друг на друга.

  • Лексинг традиционно выполняется лексером (например, lex tool).
  • Парсинг традиционно выполняется парсером (например, инструмент бизона ).
  • Инструмент позволяет записывать функцию thoses больше, чем я сделал в формальном выражении.

Аспект Thoses является основой компиляции программы. Кодирование thoses вещь улучшит вас много, потому что это тяжело и фундаментально.

0
задан KlausKerner 6 March 2019 в 13:33
поделиться