解析MATHML运营商使用ANTLR(Parsing MathML Operators using

2019-10-17 08:55发布

我试图解析介绍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.

我的树语法的作品,如果有只有一个+节点之间,但是当有一个以上的序列,它崩溃。

文章来源: Parsing MathML Operators using ANTLR