Python 3: TypeError: объект 'int' не может быть повторен в списке строковых элементов

Хорошая дискуссия по алгоритмам Shunting Yard http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm В представленном там алгоритме используется ключевая идея стека операторов но имеет некоторую грамматику, чтобы знать, что следует ожидать дальше. Он имеет две основные функции E(), которые ожидают выражения и P(), которые ожидают либо префиксный оператор, переменную, число, скобки и функции.

Если мы говорим, что P обозначает некоторую последовательность префикса, а B - двоичный оператор, то любое выражение будет иметь вид

P B P B P

т.е. вы либо ожидаете последовательность префикса, либо двоичный оператор. Формально грамматика

E -> P (B P)*

, а P будет

P -> -P | variable | constant | etc.

. Это означает psudocode как

E() {
    P()
    while next token is a binary op:
         read next op
         push onto stack and do the shunting yard logic
         P()
    if any tokens remain report error
    pop remaining operators off the stack
}

P() {
    if next token is constant or variable:
         add to output
    else if next token is unary minus: 
         push uminus onto operator stack
         P()
}

. Вы можете развернуть это, чтобы обрабатывать другие унарные операторы, функции, скобки, суффиксные операторы.

0
задан binaryglot 3 March 2019 в 11:41
поделиться