あ~、思ったより教科書が頭に入ってないことにショックorz
とりあえず、帰ったら言語論のpdfを一から読み直そう。
課題に関しては、一応ここまでにしておいて、
あとは期末試験後に回そう。
最近、dragon ashの古いアルバム(Viva la Revolutionとか)にまた嵌まってしまった。
[必要な作業@memo]
【全般】
PDFの熟読
【関数toTokens】
・ノードが初期ノードかどうかを調べる関数or方法
・ノードを単純なstring型にする関数or方法
・トークン数列に文字列を加える方法
・トークン数列の文頭に付加する関数or方法
・トークン数列の末尾に付加する関数or方法
・ノードを演算子ノードかどうかを調べる関数or方法
・演算子ノードの最初の子を見つける方法or関数
・演算時ノードの残りの子ノード達を探す方法or関数
・開き丸括弧が必要とされているかどうかを見極める方法or関数(←多分ない)
・閉じ括弧が必要とされているかどうかを調べる方法or関数(←コレは多分無い)
【関数isParenthesisRequired】
・丸括弧が必要とされているかどうかを調べる方法or関数
・演算子の優先度と結合性を調べる関数
・↑の結果を比較する関数orアルゴリズム
[メソッド一覧]
・Infix.java :中置記法
protected void parse(final String[] tokens) throws InvalidExpressionException {
計算式であるトークンの数列を構文解析する。
加算とか減算とか平均の演算子と、乗算とか除算とかmodの演算子を解析する。
限りなくメインメソッドに近い。
* 引数tokensは計算式をトークン化した表現
private String[] getSubExpression(final String[] tokens, final int indexStart) {
* 丸括弧の中にあるトークンのサブ数列を取り戻す。
* 引数tokensとは、計算式のトークンの数列である。
* 引数indexStartとは丸括弧を探し始めるindexのことである。
* 丸括弧の中にあるトークンのサブ数列を返す。
private void setChildNodeAtFreeBranch(IOperatorNode nodeOp, INode node) throws InvalidExpressionException {
* どのノードも存在していない位置にある演算子ノードの子ノードとして、設置する。
* 引数nodeOpとは、演算子ノードのこと。
* 引数nodeとは、演算子ノードの子ノードになるはずのノードのこと。
private boolean isFilledOperator(final IOperatorNode nodeOp) {
* 演算子ノードが全ての子ノードを持っているかどうかを返す(まだ設置できるかどうかを確かめるため?)
* nodeOpとは、演算子ノードのことである。
* もしも、その演算子ノードが全ての子ノードを持っていたら、trueを返す。そうでなければ、falseを返す。
protected Collection toTokens(INode node) {
* 計算式の抽象構文ツリーからのトークンの訂正を返す。
* 引数nodeは計算式の抽象構文木の根ノードのことである。
* 計算式のトークンの訂正を返す。
//↓ココが必修訂正箇所
private Collection toTokens(INode node, IOperatorNode opParentNode) {
* 計算式の抽象構文木からトークンの訂正値を返す。
* 引数nodeは計算式の抽象構文木の根ノードを返す
* 引数opParentNodeとは、根ノードの親ノードとなる、演算子ノードのことである。
* 計算式のトークンの訂正値を返す。
// もし、そのノードが初期ノードだったら
// そのノードを単純にstring型にして、トークンの数列に文字列を加える。
// もし、そのノードが演算子ノードだったら、
// もし、開き丸括弧が必要とされていたら、開き丸括弧を最初のトークンの数列に追加して、
// 演算子ノードの最初の子を、トークンの数列に加えて、
// その後、演算子記号を、トークンの数列に追加して、
// そして、演算子ノードの子ノード達の残りを、トークンの文字列に加える。
// もし、閉じ括弧が必要とされていたら、トークンの末尾に閉じ括弧を加える。
//↓ココが必修訂正箇所
private boolean isParenthesisRequired(final IOperatorNode opCur, final IOperatorNode opChild) {
* 丸括弧が必要とされているかどうかを返す。
* 演算子の優先度と結合性を元にして、
* 演算子ノードとその子演算子ノードを比較して、
* 引数opCurとは、現在フォーカスされている演算子ノードのこと。
* 引数opChildとは、現在の演算子ノードの子ノードである、演算子ノードのこと。
* もし、子ノードのために丸括弧が必要とされていたらtrueを返す。そうでなければfalseを返す。
private boolean hasHigherPrecedenceThan(final IOperatorNode opNodeA, final IOperatorNode opNodeB) {
* 演算子が他の演算子より優位かどうかを返す
* 引数opNodeAは、現在フォーカスされている演算子ノードのこと。
* 引数opNodeBとは、現在の演算子ノードと比較する演算子ノードのこと。
* もし現在の演算子ノードがもう一方の演算子ノードより
高い優先度をもっていたらtrueを返す。そうでなければfalseを返す。
private boolean equalsPrecedence(final IOperatorNode opNodeA, final IOperatorNode opNodeB) {
* 演算子がもう一方の演算子と同じ優先度を持っているかどうかを返す。
* 引数opNodeAとは、現在フォーカスされている演算子ノードのこと
* 引数opNodeBとは、現在の演算子ノードと比較する演算子ノードのこと
* もし現在の演算子ノードがもう一方の演算子ノードと
同じ優先度をもっていたらtrueを返す。そうでなければfalseを返す。
private int getPrecedence(final IOperatorNode opNode) {
* 演算子の優先度を返す。
* 低い値は優先度が高いことを意味する。
* マイナスの値はエラーを返す。
* 引数opNodeとは、現在フォーカスされている演算子ノード。
* 演算子の優先度をint型の数値で返す(-1,0,1)多分?
private int getPrecedence(final int opID) {
* 演算子の優先度を返す。
* 低い値は優先度が高いことを意味する。
* マイナスの値はエラーを返す。
* 引数opNodeとは、現在フォーカスされている演算子ノード。
* 演算子の優先度をint型の数値で返す
private int getAssociativity(final IOperatorNode opNode) {
* 演算子の結合性を返す
* 負の値はエラーを表示する。
* 引数opNodeとは、現在フォーカスされている演算子ノード。
* int型の数値として、演算子の結合性を返す。
private int getAssociativity(final int precedence) {
* 演算子の結合性を返す。
* マイナスの値はエラーを表示させる。
* 引数opNodeとは、現在フォーカスされている演算子ノード。
* int型の数値として、演算子の結合性を返す。
public String getNotation() {
* 計算式のための表記法を返す。
protected boolean isSpaceSeparatorNeeded() {
* もし空白文字が、stringの表現をセパレータとして必要とする場合
* 計算式の表記法に向けたトークンの数列から生成された
* もしも空白文字が必要とされたらTRUEを返す、そうでなければFALSEを返す。
・IOperatorNode.java:演算子ノードのインターフェース
* 文字列として演算子記号を返す。
public String getOperator();
* 演算子の識別子(演算子ID)を返す
public int getOperatorID();
* 演算子のアリティを返す。
public int getArity();
・OperatorNode.java
private static int operatorString2operatorIndex(final String strOp) {
private static String operatorIndex2operatorString(final int index) {
/* package */
static boolean isOperator(final String strOp) {
private static int operatorID2operatorIndex(final int id) {
private static int operatorIndex2operatorID(final int index) {
private static int operatorString2operatorID(final String strOp) {
private static String operatorID2operatorString(final int id) {
private static int getArity(final int id) {
-Constructor-
protected OperatorNode(final int id) {
protected OperatorNode(final String strOp) {
-method-
*演算子のstring表現を返す
public String getOperator() {
*演算子の識別子を返す
public int getOperatorID() {
*子ノード達の数を返す
public int getNumberOfChildren() {
* indexの位置にある子ノードを返す。
* 引数indexとは、子ノードのindexのこと。
* indexの位置になる子ノードを返す。
public INode getChildNode(final int index) {
* indexの位置にある子ノードとして、そのノードをセットする。
* 引数indexとは、子ノードのindexのこと。
* 引数childNodeとは、indexの位置にセットされるノードのこと。
public void setChildNode(final int index, final INode childNode) {
* 子ノードのindexを返す。
* 引数nodeとは、子ノードとしてチェックされるノードのこと。
* もし、そのノードが子ノードであれば、indexの値を返す。そうでなければfalse(NOT_FOUND)を返す。
public int getChildIndex(final INode node) {
* このノードのコピーを作る。
* 引数bDeepとは、もしもtrueならば、deepcopyをつくり、
そうでなければshallowcopyを作る。
public INode cloneNode(final boolean bDeep) {
* このオブジェクトのコピーを生成する。
* コピーされたオブジェクトを返す。
protected Object clone() {
* ノードを評価して、評価した結果を返す。
public int evaluate() throws EvaluationException,InvalidVariableException {
* ノードを評価して、評価した結果を、環境と共に返す。
* 引数envとは、環境のこと
* 評価した結果をint型の数値で返す。
public int evaluate(final Environment env) throws EvaluationException,InvalidVariableException {
* このノードのストリング型の表現を返す。
public String toString() {
[演算子識別子]
0=no operator
1=addition
2=subtraction
3=multiplication
4=division
precedence
優先、優位
denote
~を意味する、示す、~を表示する、~の名称である
operator
演算子
arithmetical
演算の、算数の
arithmetic expression
計算式
r
associativity
結合性
identifier
識別子、一意名
sequence
数列、列
representation
表示、表現、説明
modulo
剰余演算子modのこと
token
しるし、証拠、表象
<コ>トークン信号、、優先権信号
recursively
再帰的に
whitespace
空白スペース
parse
構文解析をする
partial
部分的な、一部の
notation
表記法
[Arity]
アリティ (arity) とは、
関数や演算子に対し、それらが取る引数 (オペランド) の
個数を意味するのに、代数学、論理学、計算機科学などにおいて
用いられる用語である。
項数のような訳語が当てられる場合もあるが、
arity と英単語のまま用いられることも多い。
この用語は、ラテン語起源の英単語において単項の演算を
unary (operation), 2 項を binary, 3 項を ternary,
さらには一般に n 項を n-ary というように
接尾辞 -ary をつけた形容詞で引数の個数を表すことから来ている。
[Shallow copy]
オブジェクトをコピーする際に、
参照先をそのままにして、
そのオブジェクト自体だけをコピーすること。
反対に、
そのオブジェクトが参照しているオブジェクトまでコピーして、
参照 (ポインタ) を書き換えることを deep copy と言う。
[Deep copy]
オブジェクトをコピーする際に、
そのオブジェクトが参照しているオブジェクトまでコピーして、
参照 (ポインタ) を書き換えること。
反対に、
参照先をそのままにして対象オブジェクトのみを
コピーすることを shallow copy と言う。
0 件のコメント:
コメントを投稿