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

       

грамматики построим анализатор методом рекурсивного


Пример
(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

Содержание раздела