diff options
Diffstat (limited to 'doc/expert/det_prec')
-rw-r--r-- | doc/expert/det_prec | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/doc/expert/det_prec b/doc/expert/det_prec new file mode 100644 index 0000000..c2dd72d --- /dev/null +++ b/doc/expert/det_prec @@ -0,0 +1,103 @@ +@Section + @Title { Precedence and associativity of symbols } + @Tag { precedence } +@Begin +@PP +Every symbol in Lout has a {@I precedence}, +preceden @Index { Precedence } +which is a positive whole number. When two symbols compete for an object, +the one with the higher precedence wins it. For example, +@ID @Code { +"a | b / c" +} +is equivalent to @OneCol @Code { "{" a "|" b "}" "/" c } rather than +{@OneCol @Code { a "|" "{" b "/" c "}"} }, because @Code "|" has higher +precedence than @Code "/" and thus wins the {@Code b}. +@PP +When the two competing symbols have equal precedence, Lout applies a +second rule. Each symbol is either @I left-associative or +associativity @Index { Associativity } +{@I right-associative}. The value of @OneCol @Code { a op1 b op2 c} is taken +to be @OneCol @Code { "{" a op1 b "}" op2 c } if the symbols are both +left-associative, and @OneCol @Code "a op1 { b op2 c }" if they are +right-associative. In cases not covered by these two rules, use braces. +@PP +It sometimes happens that the result is the same regardless of how the +expression is grouped. For example, @OneCol @Code { "{" a "|" b "}" "|" c } +and @OneCol @Code { a "|" "{" b "|" c "}" } are always the same, for any +combination of objects, gaps, and variants of {@Code "|"}. In such cases +the symbols are said to be {@I associative}, and we can confidently omit +the braces. +@PP +User-defined symbols may be given a precedence and associativity: +@ID @OneRow @Code { +"def @Super" +" precedence 50" +" associativity right" +" left x" +" right y" +"{" +" @OneRow { | -2p @Font y ^/0.5fk x }" +"}" +} +They come just after any @Code into clause and before any parameter +definitions. The precedence may be +any whole number between 10 and 100, and if omitted is assigned the +value 100. The higher the number, the higher the precedence. The +associativity may be @Code left or {@Code right}, and if omitted +defaults to {@Code right}. Lout's symbols have the following +precedences and associativities: +@ID @Tab + vmargin { 0.5vx } + @Fmta { @Col @CC A ! @Col @CC B ! @Col C } +{ +@Rowa + A { Precedence } + B { Associativity } + C { Symbols } +@Rowa +@Rowa + A { 5 } + B { associative } + C { @Code "/ ^/ // ^//" } +@Rowa + A { 6 } + B { associative } + C { @Code "| ^| || ^||" } +@Rowa + A { 7 } + B { associative } + C { @Code "& ^&" } +@Rowa + A { 7 } + B { associative } + C { @Code "&" in the form of one or more white space characters } +@Rowa + A { 10-100 } + B { @Code left or @Code right } + C { user-defined symbols } +@Rowa + A { 100 } + B { @Code right } + C { @@Wide, @@High, @@Graphic, etc. } +@Rowa + A { 101 } + B { - } + C { @Code "&&" } +@Rowa + A { 102 } + B { associative } + C { @Code "&" in the form of 0 spaces } +@Rowa + A { 103 } + B { - } + C { Body parameters and right parameters of @@Open } +} +Actually the precedence of juxtaposition (two objects separated +by zero spaces) is a little more complicated. If either of the +two objects is enclosed in braces, the precedence is 7 as for +one or more spaces. If neither object is enclosed in braces, +the precedence is 102 as shown above. This complicated rule +seems to accord better with what people expect and need in +practice than a pure precedence rule can do. +@End @Section |