Presentation MathML を解析し、ANTLR を使用して AST を構築しようとしています。ほとんどのタグがサポートされており、特定のコンストラクト用のノードを構築できます。
オペレーターに困っています。このページでは;
http://www.w3.org/TR/MathML3/appendixc.html
演算子のリスト、デフォルトで表示される形式 (prefix、infix、または postifx)、および演算子の優先順位を示す優先値があります。
C やその他のプログラミング言語の式を記述する方法と同じように、各演算子コードを取得してレクサーに追加し、優先順位に基づいて単項式、2 項式、後置式のルールを記述できます。
問題は、演算子タグに、ツリー構造を変更する値「prefix」、「infix」、および「postfix」を取ることができる「form」属性を含めることができることです。ただし、パーサー段階まで属性は表示されません。
さらに、演算子タグには演算子として機能する自然言語を含めることができるため、優先順位を推測して正しいツリーを構築することはできません。
パーサー段階で演算子の優先順位を無視し、式をノードのリストとしてロードしてから、ツリー ウォーカーを使用してセマンティック段階でツリーを書き直すことは可能でしょうか? この段階で属性値を取得し、既知の演算子とその優先度の辞書を保持します。
続行する前に何ができるかを決定する必要があるため、これは私の進歩にとって大きなマイルストーンです。
編集
次のMathML式があります...
<math>
<mrow>
<mi>a</mi>
<mo>+</mo>
<mi>b</mi>
<mo>+</mo>
<mi>c</mi>
</mrow>
</math>
私は2つの異なる木を作ることができます...
また...
2 番目のものは、ツリー内の「+」演算子の結合性をエンコードします。これは、プログラミング言語に対して通常行うことです。
しかし、仕様には何百もの演算子があるため、非常に大きな文法が必要になり、プロダクション ルールには多くの代替手段が必要になります。
自然言語も演算子に使用できます (実際にはそうすべきではありませんが)...
<math>
<mrow>
<mo>there exists</mo>
<mi>x</mi>
<mo>in</mo>
<mi>S</mi>
</mrow>
</math>
だから私が求めているのは、ツリー内の演算子をエンコードするための最良の方法は何かということです。プレゼンテーション MathML をコンテンツ MathML に変換しようとしているので、プレゼンテーションのセマンティクスを分析して、それが数学的に何を意味するかを判断できるようにする必要があります。
Tree Grammar フェーズで最初のツリーを 2 番目のツリーに変換する方法はありますか?
編集
次のMathMLと生成されたツリーがあります...
<math>
<mrow>
<mi>a</mi>
<mo>+</mo>
<mi>b</mi>
<mo>+</mo>
<mi>c</mi>
</mrow>
</math>
MO
これは、他のノードの間にあるノードを見つけるために使用したい単純なツリー文法MI
です。
tree grammar SimpleReWriter;
options
{
tokenVocab = MathML;
ASTLabelType = CommonTree;
output = AST;
backtrack = true;
language = CSharp3;
filter = true; // use pattern matching
rewrite = true;
}
topdown: findInfix; // look for infix operators
findInfix : ^(MROW left=.+ MO right=.+) -> ^(MROW ^(MO $left $right));
SimpleReWriter
クラス内でプログラムがクラッシュし、次のエラー メッセージが表示されます。Operation is not valid due to the current state of the object.
私のツリー文法は、ノード間に 1 つしかない場合は機能+
しますが、複数のシーケンスがある場合はクラッシュします。