编译原理(第三版)词法分析器
Posted --lr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理(第三版)词法分析器相关的知识,希望对你有一定的参考价值。
/* begin x:=9; if x > 0 then x:= 2*x+1/3; end # */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define _KEY_WORD_END "waiting for your expanding" typedef struct { int typenum; char *word; }WORD; char input[255]; char token[255]=""; int p_input; int p_token; char ch; char* rwtab[] = {"begin","if","then","while","do","end",_KEY_WORD_END}; WORD * scaner(); int main() { int over = 1; WORD* oneword = new WORD; printf("Enter Your words(end with #):"); scanf("%[^#]s",input); p_input = 0; printf("Your words:\n%s\n",input); while(over < 1000 &&over !=-1) { oneword = scaner(); if(oneword->typenum <1000) printf("(%d,%s)\n",oneword->typenum,oneword->word); over = oneword->typenum; } printf("\npress # to exit:"); scanf("%[^#]s",input); return 0; } char m_getch() { ch = input[p_input]; p_input = p_input+1; return(ch); } void getbc() { while(ch == ‘ ‘||ch == 10) { ch = input[p_input]; p_input++; } } void concat() { token[p_token] = ch; p_token++; token[p_token] = ‘\0‘; } int letter() { if((ch >= ‘a‘&& ch <= ‘z‘)|| (ch >=‘A‘&&ch <= ‘Z‘)) return 1; else return 0; } int digit() { if(ch >= ‘0‘&&ch <=‘9‘)return 1; else return 0; } int reserve() { int i = 0; while(strcmp(rwtab[i],_KEY_WORD_END)) { if(!strcmp(rwtab[i],token)) return i+1; i++; } return 10; } void retract() { p_input--; } char* dtb() { return NULL; } WORD* scaner() { WORD* myword = new WORD; myword->typenum = 10; myword->word = ""; p_token = 0; m_getch(); getbc(); if(letter()) { while(letter()||digit()) { concat(); m_getch(); } retract(); myword->typenum = reserve(); myword->word = token; return(myword); } else if(digit()) { while(digit()) { concat(); m_getch(); } retract(); myword->typenum = 11; myword->word = token; return(myword); } else switch(ch) { case‘=‘:m_getch(); if(ch == ‘=‘) { myword->typenum = 25; myword->word = "=="; return(myword); } retract(); myword->typenum = 21; myword->word = "="; return(myword); break; case‘+‘: myword->typenum = 13; myword->word = "+"; return(myword); break; case‘-‘: myword->typenum = 14; myword->word = "-"; return(myword); break; case‘*‘: myword->typenum = 15; myword->word = "*"; return(myword); break; case‘/‘: myword->typenum = 16; myword->word = "/"; return(myword); break; case‘(‘: myword->typenum = 27; myword->word = "("; return(myword); break; case‘)‘: myword->typenum = 28; myword->word = ")"; return(myword); break; case‘[‘: myword->typenum = 28; myword->word = "["; return(myword); break; case‘]‘: myword->typenum = 29; myword->word = "]"; return(myword); break; case‘{‘: myword->typenum = 30; myword->word = "{"; return(myword); break; case‘}‘: myword->typenum = 31; myword->word = "}"; return(myword); break; case‘,‘: myword->typenum = 32; myword->word = ","; return(myword); break; case‘:‘:m_getch(); if(ch == ‘=‘) { myword->typenum = 18; myword->word = ":="; return(myword); } retract(); myword->typenum = 17; myword->word = ":"; return(myword); break; case‘;‘: myword->typenum = 26; myword->word = ";"; return(myword); break; case‘>‘:m_getch(); if(ch == ‘=‘) { myword->typenum = 24; myword->word = ">="; return(myword); } retract(); myword->typenum = 23; myword->word = ">"; return(myword); break; case‘<‘:m_getch(); if(ch == ‘=‘) { myword->typenum = 22; myword->word = "<="; return(myword); } else if(ch == ‘>‘) { myword->typenum = 21; myword->word = "<>"; return(myword); } retract(); myword->typenum = 20; myword->word = "<"; return(myword); break; case‘!‘:m_getch(); if(ch == ‘=‘) { myword->typenum = 40; myword->word = "!="; return(myword); } retract(); myword->typenum = -1; myword->word = "ERROR"; return(myword); break; case‘#‘: myword->typenum = 0; myword->word = "#"; return(myword); break; case‘\0‘: myword->typenum = 1000; myword->word = "OVER"; return(myword); break; default: myword->typenum = -1; myword->word = "ERROR"; return(myword); } }
以上是关于编译原理(第三版)词法分析器的主要内容,如果未能解决你的问题,请参考以下文章
编译原理习题—LL文法构造预测分析器递归下降分析LRSLRLR分析—陈意云张昱第三版第三章