- 实验目的
设计词法分析器
- 设计方法
- 写出该语言的词法规则。
- 把词法规则转换为相应的状态转换图。
- 把各转换图的初态连在一起,构成识别该语言的自动机
- 设计扫描器
- 把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。
- 扫描器从初态出发,当识别一个单词后便进入终态,送出二元式。
- 实验代码:
#include<bits/stdc++.h> #define KEYWORD 1 #define BORDER 2 #define OPERATOR 3 #define IDENTIFIER 4 #define CONSTINTEGRAL 5 #define ELSE 0 using namespace std; string keyWord[] = { "void", "int", "char", "main", "return", "if", "else"}; string border[] = { "(", ")", "[", "]", "{", "}", ";", "," }; string operator0[] = { "+", "-", "*", "/", "%", "=" }; bool Letter(char c) { if (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') { return true; } return false; } bool KeyWord(string str) { for (int i=0;i<7;i++) { string s = keyWord[i]; if (s == str) return true; } return false; } bool Border(string str) { for (int i=0;i<8;i++) { string s = border[i]; if (s == str) return true; } return false; } bool Operator(string str) { for (int i=0;i<6;i++) { string s = operator0[i]; if (s == str) return true; } return false; } bool Digit(char c) { if (c >= '0' && c <= '9') { return true; } return false; } int Code(string str) { int type = ELSE; if (KeyWord(str)) type = KEYWORD; else if (Border(str)) type = BORDER; else if (Operator(str)) type = OPERATOR; else if (Digit(str[0])) type = CONSTINTEGRAL; // 标识符 else if (str[0] == '_' || Letter(str[0])) { type = IDENTIFIER; { for (int i = 1; i < str.length(); i++) { // 若不符合标识符规则,则type=0 if (!(str[i] == '_' || Letter(str[i]) || Digit(str[i]))) { type = ELSE; break; } } } } else type = ELSE; return type; } int main() { string token=""; cout << "请输入测试代码,以#结尾" << endl; char ch='*'; do{ ch=getchar(); if(ch==' '||ch=='\n') continue; token=token+ch; }while(ch!='#'); token.erase(token.end() - 1); cout << "token = " << token << endl; string str = ""; int i = 0; while(i < token.length()) { str = ""; // 数字开头 if (Digit(token[i])) { while (Digit(token[i])) str = str + token[i++]; cout << "(" << Code(str) << ", " << "\"" << str << "\"" << ")" << endl; } // 下划线或者字母开头的单词,即标识符或者关键字 else if (token[i] == '_' || Letter(token[i])) { while (token[i] == '_' || Letter(token[i]) || Digit(token[i])) { str = str + token[i++]; // 如果是关键字,立即结束 if (Code(str) == KEYWORD) break; } cout << "(" << Code(str) << ", " << "\"" << str << "\"" << ")" << endl; } // 运算符 else { str = str + token[i++]; cout << "(" << Code(str) << ", " << "\"" << str << "\"" << ")" << endl; } } }