Разбор MathML операторов с использованием ANTLR

Я пытаюсь разобрать Presentation MathML и построить AST с помощью ANTLR. У меня есть большинство поддерживаемых тегов, и я могу создавать узлы для конкретных конструкций.

У меня проблемы с операторами. На этой странице;

http://www.w3.org/TR/MathML3/appendixc.html

Существует список операторов, форма, в которой они отображаются по умолчанию (префикс, инфикс или postifx) и значение приоритета, которое дает приоритет оператору.

Я мог бы взять каждый код оператора и добавить его в свой лексер, а затем написать правила для унарных, двоичных и постфиксных выражений, основанные на приоритете, точно так же, как я написал бы выражения для C или некоторого другого языка программирования.

Проблема заключается в том, что теги оператора могут содержать атрибут "form", который может принимать значения "prefix", "infix" и "postfix", которые изменяют древовидную структуру. Я не могу видеть атрибуты до стадии парсера.

Кроме того, тег оператора может содержать естественный язык, чтобы действовать как оператор, поэтому я не могу определить приоритет и, таким образом, построить правильное дерево.

Можно ли было игнорировать приоритет оператора на этапе синтаксического анализа, просто загрузить выражения в виде списка узлов и затем переписать дерево на семантической стадии, используя обходчик дерева? На этом этапе у меня были бы значения атрибутов, и я держу словарь известных операторов и их приоритет / приоритет.

Это важная веха в моем прогрессе, потому что я должен решить, что мне делать, прежде чем продолжить.

РЕДАКТИРОВАТЬ

У меня есть следующее выражение 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 в Content 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.

Моя грамматика дерева работает, если был только один + между узлами, но при наличии последовательности из более чем одного происходит сбой.

0 ответов

Другие вопросы по тегам