Синтаксический анализ

Синтаксический анализ осуществляет следующая функция:

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 на грамматический символ из которых состоит правило. Сама грамматика задана несколько грубо, в том смысле, что она допускает некоторые конструкции, которые являются недопустимыми для языка. Это было сделано для того, чтобы эти ошибки обнаруживались на стадии семантического анализа.

Наверх

Hosted by uCoz