Разработка компиляторов


This is bitcoin penguin review and because there have been some

Пример


Пример

(1)S -> if S then S else S (2)S -> begin S L (3)S -> print E (4)L -> end (5)L -> ; S L (6)E -> num = num

Для этой LL (1)-грамматики построим анализатор методом рекурсивного спуска.

Рассмотрим грамматику:

(1) S -> if E then S else S (2) S -> begin S L (3) S -> print E (4) L -> end (5) L -> ; S L (6) E -> num = num

Напишем анализатор языка, порождаемого этой грамматикой, методом рекурсивного спуска. Для этого нам придется описать по одной процедуре для каждого нетерминала грамматики.

class SimpleParser {

/* Лексические классы, т.е. терминалы */

const int IF = 1; const int THEN = 2; const int ELSE = 3; const int BEGIN = 4; const int END = 5; const int PRINT = 6; const int SEMICOLON = 7; const int NUM = 8; const int EQ = 9;

public static void nextStep(int lc) { if (lexical_class == lc) lexical_class = getLC(); else error(); }

public static void S(void) { switch(getLC()) { case IF: E(); nextStep(THEN); S(); nextStep(ELSE); S(); break; case BEGIN: S(); L(); break; case PRINT: E(); break; default: error(); break; } }

public static void L(void) { switch (lexical_class) { case END: getLC(); break; case SEMICOLON: getLC(); S(); L(); break; default: error(); break; } }

public static void E(void) { nextStep(NUM); nextStep(EQ); nextStep(NUM); }

public static void main(void) { lexical_class = getLC(); S(); }

} // end of SimpleParser




Содержание  Назад  Вперед