2024/04/30 WeBWorkがどのように解答判定しているのかを調べる
t6o_o6t.icon
よく分からないのでエスパーする
細かい数式の処理は pg/ に書かれている
パース処理
pg/lib/Parser.pmが重要そう
コメントを正確に読み取る必要がある
Parser.pmに定義されたsubは、おそらくtokenizeしたあとの各トークンに対応している Open
Handle an open parenthesis
トークナイザでtokenizeしたあと開き括弧が見つかった際に呼ばれる? tokenizeが呼ばれるタイミングと、Openが呼ばれるタイミングを要調査
Openが呼ばれるタイミング
sub parse内で呼ばれている
sub parse
new
$stringがisParserもisFormulaもisValueも満たさない場合
tokenizeとparseを呼び出す
Todo: isFormulaやisValueは分かるが、isParserとは何だろう
$tree = $stringとなっているということは、ここでの$stringはExpression Treeなのだろうか
Todo: もう一つ条件があり、($string // '') eq '' && $context->{flags}{allowEmptyStrings}
//はPerlでは左辺が定義されていないときに右辺を返す演算子のようだ
与えられた文字列が空で、かつ空でないときは空を表すValue Itemをtreeとして使用する?
$math
メンバ
->{string}にパース対象の文字列
->{tree}にExpression Tree
isValueがtrueのとき、$stringをそのまま->{tree}に格納する($stringがValue Itemなので)
メソッド
->tokenize
tokenizeしてtoken listを生成する?
->parse
token listからExpression Treeを生成する(コメントから訳)
tokenize
空白を全置換したあと
tokenPatternにマッチしているものに順番に何かをしている
何をしているのかは細かく追わないことにするt6o_o6t.icon
とにかく、@tokensにトークンのリストを入れている
Expression Treeの各Itemにstring、TeX、perlの3つのメソッドが生えていると推測
perl() ではperl用の表現が返ってくると考えると、