MathotaGamma

数式パーサー

目標

手順

  1. tokenizer
    字句解析。数式を最小単位(要素)に分解する
  2. parser
    構文解析。字句の構造を作成する。
    ここでは再帰下降構文解析(Prattパーサー)を用いてASTを作成する。

tokenizer

ここでは、字句解析は単純に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
#### 注釈 *※numReg: (?:\[0-9\]+(?:\\.\[0-9\]\*)?|\\.\[0-9\]+)*
*characterReg: \[a-zA-Z\\u0391-\\u03A9\\u03B1-\\u03C9\]* [^1]: `^${numReg}` [^2]: `^(?:${characterReg}(?:(?:0|[1-9][0-9]*)(?!${characterReg})|_(?:${characterReg}|${numReg})*)?)`

parser

構文解析には、再帰下降構文解析の一種であるPrattパーサーを用いてAST(抽象構文木)を作成する。
重要になってくるのが、binding power(以下、bp)である。
例えば、1+2*3-4という式において2*3を先に計算したり、
sin 2*π-3という式でsinの引数を2*πで区切ったりする。