ここでは、字句解析は単純にtokenリストを順番に参照していくだけとする。
※判定する順番は気を付けなければならない。
例えば、’cosec(1)’という文字列に対してcosとcosecを判定する際、
先にcosを判定してしまうと判定が成功してしまい、cosという字句となってしまうため、
はじめにcosecで判別しなければならない。つまり、ある判定文字列A,Bがあり、
Aの始めの文字からBが続いている場合は先にAを判定する。
| 字句名 | 判定(正規表現) | 関数か | 括弧の自動補完 |
|---|---|---|---|
| space | /^\s+/ | false | null |
| comma | /^,/ | false | null |
| parStart | /^\(/ | false | null |
| parEnd | /^\)/ | false | null |
| add | /^\+/ | false | null |
| sub | /^\-/ | false | null |
| pro | /^\*/ | false | null |
| div | /^\// | false | null |
| pow | /^\^/ | false | null |
| 絶対値はわからないので\[\]又はabs()を用いる。 | |||
| absStart | /^\[/ | false | null |
| absEnd | /^\]/ | false | null |
| csc | /^(csc|cosec)/ | true | true |
| sec | /^sec/ | true | true |
| cot | /^cot/ | true | true |
| arccsc | /^(arccsc|acsc|arccosec|acosec)/ | true | true |
| arcsec | /^(arcsec|asec)/ | true | true |
| arccot | /^(arccot|acot)/ | true | true |
| sin | /^sin/ | true | true |
| cos | /^cos/ | true | true |
| tan | /^tan/ | true | true |
| arcsin | /^(arcsin|asin)/ | true | true |
| arccos | /^(arccos|acos)/ | true | true |
| arctan2 | /^(acrtan2|atan2)/ | true | **false** |
| arctan | /^(arctan|atan)/ | true | true |
| log10 | /^log10/ | true | **false** |
| log | /^log/ | true | true |
| ln | /^ln/ | true | true |
| exp | /^exp/ | true | true |
| arg | /^arg/ | true | true |
| max | /^max/ | true | false |
| min | /^min/ | true | **false** |
| e | /^e(?!_)/ | false | null |
| i | /^i(?!_)/ | false | null |
| pi | /^pi|π/ | false | null |
| num | [^1] | false | null |
| value | [^2] | false | null |
構文解析には、再帰下降構文解析の一種であるPrattパーサーを用いてAST(抽象構文木)を作成する。
重要になってくるのが、binding power(以下、bp)である。
例えば、1+2*3-4という式において2*3を先に計算したり、
sin 2*π-3という式でsinの引数を2*πで区切ったりする。