Běžná notace operátora - Common operator notation

v programovací jazyky, vědecké kalkulačky a podobné běžná notace operátora nebo operátorská gramatika je způsob, jak definovat a analyzovat matematické a jiné formální výrazy. V tomto modelu je lineární sekvence tokenů rozdělena do dvou tříd: operátory a operandy.

Operandy jsou objekty, na nichž operátoři pracují. Patří mezi ně doslovný čísla a další konstanty, jakož i identifikátory (názvy), které mohou představovat cokoli od jednoduchých skalárních proměnných po složité agregované struktury a objekty, v závislosti na složitosti a schopnostech daného jazyka a kontextu použití. Jedním zvláštním typem operandu je skupina závorek. Výraz uzavřený v závorkách se obvykle rekurzivně vyhodnotí, aby se s ním zacházelo jako s jedním operandem na další úrovni hodnocení.

Každému operátorovi je dána pozice, přednost a asociativita. The přednost operátora je číslo (od nejvyšší po nejnižší nebo naopak), které definuje operátor, který převezme operand obklopený dvěma operátory s odlišnou prioritou (nebo prioritou). Násobení má obvykle vyšší prioritu než sčítání,[1] například 3 + 4 × 5 = 3+ (4 × 5) ≠ (3 + 4) × 5.

Z hlediska pozice operátora může být operátorem prefix, postfix nebo infix. A operátor předpony okamžitě předchází svému operandu, jako v −x. A operátor postfixu okamžitě následuje svého operandu, jako v x! například. An operátor infix je umístěn mezi levým a pravým operandem, jako v x + y. Některé jazyky, zejména rodina syntaxe C, rozšiřují tuto konvenční terminologii a hovoří také o trojice operátory infix (a? b: c). Teoreticky by dokonce bylo možné (ale ne nutně praktické) definovat závorky jako unární bifixovou operaci.

Asociativita operátora

Asociativita operátorů určuje, co se stane, když je operand obklopen operátory stejné priority, jako v 1-2-3: Operator can be levo-asociativní, pravo-asociativní nebo neasociativní. Levé asociativní operátory se aplikují na operandy v pořadí zleva doprava, zatímco operátory asociativní doprava jsou naopak. Základní aritmetické operátory jsou obvykle všechny asociativní vlevo,[1] což znamená, že například 1-2-3 = (1-2) -3 ≠ 1- (2-3). To neplatí pro vyšší operátory. Například, umocňování je obvykle správně asociativní v matematice,[1] ale je implementován jako levý asociativní v některých počítačových aplikacích, jako je Excel. V programovacích jazycích, kde je přiřazení implementováno jako operátor, je tento operátor často asociativní doprava. Pokud ano, prohlášení jako a: = b: = c by odpovídalo a: = (b: = c), což znamená, že hodnota c je zkopírována do b, která je poté zkopírována do a. Operátor, který je neasociativní, nemůže soutěžit o operandy s operátory se stejnou prioritou. v Prolog například operátor infix :- je neasociativní, takže konstrukty jako a: - b: - c jsou chyby syntaxe. Unární operátory předpony jako - (negace) nebo sin (trigonometrická funkce) jsou obvykle asociativní operátory předpony. Když operandu předchází nebo následuje více než jeden asociativní operátor předpony nebo postfixu se stejnou prioritou, nejdříve operátoři nejbližší operandu. Takže −sin x = - (sin x) a sin -x = sin (-x).

Matematicky orientované jazyky (např. On vědecké kalkulačky ) někdy umožňují implicitní násobení s vyšší prioritou než operátory předpony (například sin), takže například sin 2x + 1 = (sin (2x)) + 1.[Citace je zapotřebí ]

Operátoři předpony (a postfixu) však ne nezbytně mají vyšší prioritu než všichni operátoři infixu. Některé (hypotetické) programovací jazyky mohou mít operátor zvaný sin s prioritou nižší než ×, ale vyšší než + například. V takovém jazyce by platil sin 2 · x + 1 = sin (2 · x) +1, místo (sin 2) · x + 1, jak by tomu obvykle bylo.

Pravidla pro hodnocení výrazu jsou obvykle trojí:

  1. S libovolným dílčím výrazem v závorkách zacházejte jako s jedním rekurzivně vyhodnoceným operandem (mohou však existovat různé druhy závorek s odlišnou sémantikou).
  2. Vázat operandy na operátory s vyšší prioritou před těmi s nižší prioritou.
  3. Pro stejnou prioritu vázat operandy na operátory podle asociativity operátorů.

Několik dalších příkladů:

1-2+3/4*5+6+7 = (((1-2)+((3/4)*5))+6)+7
4 + -x + 3 = (4 + (-x)) + 3

Zobecnění společné notace operátora

Použití tříd priorit a asociativit operátorů je jen jedním ze způsobů. Není to však nejobecnější způsob: tento model nemůže dát operátorovi větší přednost, když soutěží s „-“, než může, když soutěží s „+“, zatímco stále dává „+“ a „-“ rovnocenné priority a asociativity. Zobecněnou verzi tohoto modelu (ve které lze každému operátorovi dát nezávislé levé a pravé přednosti) najdete na adrese [1].

Viz také

Reference

  1. ^ A b C Bronstein, Ilja Nikolaevič; Semendjajew, Konstantin Adolfovič (1987) [1945]. „2.4.1.1.“. V Grosche, Günter; Ziegler, Viktor; Ziegler, Dorothea (eds.). Taschenbuch der Mathematik (v němčině). 1. Přeložil Ziegler, Viktor. Weiß, Jürgen (23. vyd.). Thun a Frankfurt nad Mohanem: Verlag Harri Deutsch (a B. G. Teubner Verlagsgesellschaft, Lipsko). str. 115–120. ISBN  3-87144-492-8.