本格的に F# の二項演算子(中置記法)を導入してみる(3)
ちなみに、pars.fs 自体は、以下のように定義されている。
declExpr: | defnBindings IN typedSeqExpr %prec expr_let { mkLocalBindings (unionRanges (rhs2 parseState 1 2) $3.Range,$1,$3) } ... | declExpr JOIN_IN declExpr { SynExpr.JoinIn($1,rhs parseState 2,$3,unionRanges $1.Range $3.Range) } | declExpr BAR_BAR declExpr { mkSynInfix (rhs parseState 2) $1 "||" $3 } | declExpr INFIX_BAR_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr OR declExpr { mkSynInfix (rhs parseState 2) $1 "or" $3 } | declExpr AMP declExpr { mkSynInfix (rhs parseState 2) $1 "&" $3 } | declExpr AMP_AMP declExpr { mkSynInfix (rhs parseState 2) $1 "&&" $3 } | declExpr INFIX_AMP_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr EQUALS declExpr { mkSynInfix (rhs parseState 2) $1 "=" $3 } | declExpr INFIX_COMPARE_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr DOLLAR declExpr { mkSynInfix (rhs parseState 2) $1 "$" $3 } | declExpr LESS declExpr { mkSynInfix (rhs parseState 2) $1 "<" $3 } | declExpr GREATER declExpr { mkSynInfix (rhs parseState 2) $1 ">" $3 } | declExpr INFIX_AT_HAT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr PERCENT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr COLON_COLON declExpr { SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple ([$1;$3],[rhs parseState 2],unionRanges $1.Range $3.Range),unionRanges $1.Range $3.Range) } | declExpr PLUS_MINUS_OP declExpr { printfn "op +" mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr MINUS declExpr { mkSynInfix (rhs parseState 2) $1 "-" $3 }
operator 自体がべたべたで書いてあるのは、lex.fsl でやたらに定義してあるからなんだけど、ここに
| declExpr ident declExpr
してもうまくいかない。多分 local bind しているところの nameop を使うのかも。