2013-11-22 8 views
2

Я пишу алгоритм маневрового двора в Javascript для логической логики, и я сталкиваюсь с зацепкой с порядком операций. Операции, которые я разрешаю, следующие:Стандартный булевский порядок работы

and, or, implies, equals(biconditional), not, xor, nor, nand 

Однако я не знаю, для чего это приоритет. На данный момент у меня есть:

not>equals>implies>xor>nor>nand>or>and 

Это правильно? Есть ли какой-либо стандарт, который я могу использовать, подобно системе PEMDAS/BODMAS для чисел?

+0

Идущ Coq proof assistant, not> equals > xor> и> и> или> означает – jozefg

+0

В стандарте C используется NOT> EQUALS> AND> XOR> OR. Чтобы выполнить работу по синтаксическому анализу, унарные операторы должны иметь более высокий приоритет, чем все двоичные операторы. И, как правило, считается, что он связывает более жесткие, чем OR, что позволяет реализовать выражения в канонической дизъюнктивной форме без круглых скобок: '(A && B || C && D)'. –

+0

Поскольку вам нравится алгоритм Shunting Yard, вам также может понравиться [восхождение на приоритет] (http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm). –

ответ

2

Причины вы испытываете такое трудное время найти определение старшинства этих операторов JavaScript является то, что:

  1. Внеочередными приходит в игру только при использовании инфиксного обозначения. Поскольку вы упоминаете алгоритм маневрового двора, я полагаю, вы намерены использовать нотацию infix.
  2. Каждый язык может определить свой собственный приоритет, и поскольку вы создаете DSL, вы создаете приоритет, но он должен быть последовательным.
  3. Эти имена действительно являются именами префиксных функций, а инфикс чаще встречается с символами для операторов, чем имена. Вы должны использовать операторы и функции не имена:

    и &
    или |
    подразумевает →
    соответствует (biconditional) ↔
    нет!
    исключающего ⊕
    ни ⊽

  4. NAND
  5. При разборе конвертирования инфикса префикса или постфикс, поэтому операторы символы должны изменить к именам функций, если вы строите промежуточную форму, такие как АСТЫ.
  6. Вы не указали associativity, который вам понадобится для НЕ.
Как представляется, нет различий между различиями между этими двумя респектабельными источниками.

С "Foundations of Computer Science" Джеффри Д. Ульман

ассоциативности и старшинства логических операторов

Порядок старшинства мы будем использовать это
1. НЕ (высокий)
2. NAND
3. NOR
4. И
5. ИЛИ
6. ПОДРАЗУМЕВАЕТ 7. BICONDITIONAL (низший)

От Mathematica

НЕ
И
NAND
исключающее ИЛИ

НОР
ЭКВИВАЛЕНТНАЯ
ПОДРАЗУМЕВАЕТ

0

Кажется, что нет стандартного.

У меня есть книга (Digital design by Morris Mano), которая гласит NOT>AND>OR. это общепринятое мнение.

О другом, я нашел несколько мнений. This guy думаю, EQUIV является самым низким (Wikipedia assist). но this guy думаю EQUIV в середине XOR>EQUIV>OR (с несколькими ссылками).

Другое несогласие о XOR место. здесь this third guy согласен со вторым парнем :)

Короче говоря, два мнения:

1) NOT>AND>NAND>XOR>EQUIV>OR>NOR (игнорирующих NOR)

2) NOT>AND>NAND>NOR>OR>IMPLIES>XOR>EQUIV

Примечание: только NOT>AND>OR части сертифицированного академический ,