Я построил рекурсивный приличный синтаксический анализатор, основанный на грамматике. В настоящее время мой синтаксический анализатор только сообщает, принимается ли входная последовательность токенов грамматикой. Я хочу вернуться, если грамматика принимает ввод и абстрактное синтаксическое дерево. Я не уверен, как это сделать.
На данный момент у меня есть функция, соответствующая каждому продукционному правилу в грамматике. Я преобразовал грамматику так, что Терминал всегда является первым элементом каждого производственного правила. Ниже приведено подмножество грамматики, для которой я пытаюсь построить синтаксическое дерево.
program -> VAR = exp
exp -> NUM term
exp -> LEFTPAR exp RIGHTPAR
term -> MUL NUM term
term -> DIV NUM term
term -> . (empty)
Примером функции для правила может быть:
public Pair<bool, Token> exp(Token tok)
{
if (tok.type == NUM)
{
return term(tok.next);
}
if (tok.type = LEFTPAR)
{
Pair<bool, Token> temp = exp(tok.next);
if (temp.left && temp.right.type == RIGHTPAR)
return new Pair<bool, Token>(true,temp.right.next);
return new Pair<bool, Token>(false,null);
}
}
Какой должна быть стратегия для превращения подобных функций в построитель синтаксического дерева? Я попытался передать узел дерева в качестве входных данных для всех функций, но когда есть правила, которые имеют несколько нетерминалов, это становится немного более запутанным. Кажется, что было бы проще построить дерево синтаксического анализа, а затем преобразовать его в послесловие AST. Любая помощь приветствуется!
term
в моем примере или несколько (как в моей полной грамматике)? Кажется, что единственное решение состоит в том, чтобы иметь кучу операторов if, чтобы проверить, какие из них являются нулевыми, а затем не возвращать их. - person McAngus   schedule 22.02.2016