Синтаксический анализ
Синтаксический анализ осуществляет следующая функция:
bool syntax ( CArrRef<Token> source, Suite<TreeNode> & tree, Suite<char8> & result );
На входе - массив токенов source.
На выходе - синтаксическое дерево разбора tree и текст программы с возможными сообщениями об ошибке.
Эта функция сравнительно несложная, действует по принципу LL(1)-анализатора и не зависит от грамматики.
Грамматика описывается в файле syntax.cpp при помощи классов GSymbol, RuleAtom и Rule:
class GSymbol
{
public:
const TokenType type;
const Rule * const rule;
ListRAP list;
GSymbol ( const Rule * r, TokenType t );
};
class RuleAtom
{
public:
const RuleAtom * next;
const GSymbol * symbol;
explicit RuleAtom ( const GSymbol * s, const RuleAtom * a = 0 ) : symbol(s), next(a) {}
};
class Rule
{
public:
const RuleAtom * atom;
const Rule * next;
explicit Rule ( const RuleAtom * a, const Rule * r = 0 );
};
Класс GSymbol задаёт грамматический символ ( терминал или нетерминал ). У терминалов указатель rule равен нулю,
а у нетерминалов указывает на объект класса Rule, который соответствует правилу вывода.
Его поле next указывает на следующее правило, если их несколько. Само правило состоит из атомов ( класс RuleAtom ).
У атома поле next указывает на следующий атом, а поле symbol на грамматический символ из которых состоит правило.
Сама грамматика задана несколько грубо, в том смысле, что она допускает некоторые конструкции, которые являются
недопустимыми для языка. Это было сделано для того, чтобы эти ошибки обнаруживались на стадии семантического анализа.
Наверх