我试图解析介绍MathML和使用ANTLR构建AST。 我最有标签的支持,我可以建立针对特定结构的节点。
我在与运营商的麻烦。 在本页;
http://www.w3.org/TR/MathML3/appendixc.html
还有就是运营商的名单,他们在默认情况下(前缀,中缀或postifx)和优先级值,这给运营商的优先级出现在表单中。
我可以把每一个操作员代码,并将其添加到我的词法分析器,然后编写规则为依据优先级一元,二元和后缀的表情,就像我会怎么写C或其他一些编程语言的表达。
问题是,运营商标签可以包含一个“形式”的属性,它可以采取值“前缀”,“缀”和“后缀”,从而改变了树结构。 我看不到属性,直到分析阶段,虽然。
另外一个操作标签可以包含自然语言作为一个经营者,所以我不能推断出优先级,从而建立一个正确的树。
是否有可能忽略在分析阶段的运算符优先级,只需加载表达式为节点列表,然后在语义阶段重新写树,使用树遍历? 我想在这个阶段的属性值和我抱知道运营商和它们的优先级/优先级的字典。
这是一个重大的里程碑,我的进步,因为我必须做出决定之前,我继续我能做些什么。
编辑
我有以下MATHML表达...
<math>
<mrow>
<mi>a</mi>
<mo>+</mo>
<mi>b</mi>
<mo>+</mo>
<mi>c</mi>
</mrow>
</math>
我可以建立两个不同的树...
要么...
第二个编码树中的“+”操作符的关联性,这就是我们平时编程语言做。
但也有数百个运营商在规范,所以我将有一个非常大的语法,很多在我的生产规则的替代品。
自然语言也可以使用(虽然真的不应该)为运营商...
<math>
<mrow>
<mo>there exists</mo>
<mi>x</mi>
<mo>in</mo>
<mi>S</mi>
</mrow>
</math>
那么,我问的是什么就是去树编码运营商的最佳方式。 我想转换演示MATHML到内容MATHML所以我需要分析演示的语义能够决定这意味着什么数学。
有没有办法在第一树转换到第二个在语法树相?
编辑
我有以下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.
我的树语法的作品,如果有只有一个+
节点之间,但是当有一个以上的序列,它崩溃。