词法分析器设计
来源:互联网 发布:高频彩票算法大揭秘 编辑:程序博客网 时间:2024/05/22 15:10
词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。程序语言的单词符号一般分为五种:关键字(保留字/基本字)if、while、begin…;标识符:常量名、变量名…;常数:34、56.78、true、‘a’、…;运算符:+、-、*、/、〈、and、or、….、;界限符:, ; ( ) { } /*…。
方法:
词法分析器的设计方法有如下四个步骤:
1.写出该语言的词法规则。
2.把词法规则转换为相应的状态转换图。
3.把各转换图的初态连在一起,构成识别该语言的自动机。
4.设计扫描器;把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。扫描器从初态出发,当识别一个单词后便进入终态,送出二元式。
针对该程序设计的DFA 图大致如下:
核心代码(这段是分析代码。其他的定义代码,识别字母代码,识别数字代码,等等就不一一列举了,源程序中有):
/** * 初始化并读取源代码文件 * 扫描程序开始执行,直到读取文件结束符EOF * @throws Exception */ private void scanning(String originalFile) throws Exception { this.sourceFile = new BufferedReader(new FileReader(originalFile)); this.initial(); while(!isEOF) { getToken(); } System.out.println("========================> end scanning ..."); } /** * 获取下一个字符 * @return * @throws Exception */ private char getNextChar() throws Exception { char nextChar = '\0'; if(!(charPos < bufSize)) { if((eachLine = sourceFile.readLine()) != null) { lineNum++; System.out.println(lineNum + ": " + eachLine); lineBuf = eachLine.toCharArray(); bufSize = eachLine.length(); charPos = 0; nextChar = lineBuf[charPos++]; } else { isEOF = true; nextChar = '\0'; } } else { nextChar = lineBuf[charPos++]; } return nextChar; } /** * 【按步长(step)】取消获取下一个字符 */ private void unGetNextChar(int step) { if(!isEOF) { charPos -= step; } } /** * 获取一个Token * @return * @throws Exception */ private String getToken() throws Exception { String tokenStr = ""; String currentToken = ""; int currentState = Start; boolean isSave; // 不同时为EOF和Done状态 while(currentState != Done && !isEOF) { char c = getNextChar(); isSave = true; switch(currentState) { case Start: if(isDigit(c)) { currentState = Num; } else if(isLetter(c) || c == '.') { //点号是为了处理头文件iostream.h的格式 currentState = ID; } else if(c == ' ' || c == '\t' || c == '\n') { isSave = false; } else if(c == '!') { currentState = NE; } else if(c == '=') { currentState = EQ; } else if(c == '<') { currentState = NM; } else if(c == '>') { currentState = NL; } else if(c == '/') { currentState = Coms; isSave = false; } else if(c == '"') { currentState = Str; } else { currentState = Done; // if(isSingle(c)) { // currentToken = "" + c; // currentState = Done; // isSave = false; // } } break; case Num: if(!isDigit(c)) { currentState = Done; unGetNextChar(1); isSave = false; } break; case ID: if(!isLetter(c) && !isDigit(c)) { currentState = Done; unGetNextChar(1); isSave = false; } break; case NE: if(c != '=') { currentState = Special; unGetNextChar(2); isSave = false; } else { currentState = Done; } break; case NM: if(c != '=' && c != '<') { currentState = Special; unGetNextChar(2); isSave = false; } else { currentState = Done; } break; case NL: if(c != '=' && c != '>') { currentState = Special; unGetNextChar(2); isSave = false; } else { currentState = Done; } break; case EQ: if(c != '=') { currentState = Special; unGetNextChar(2); isSave = false; } else { currentState = Done; } break; case Str: if(c == '"') { currentState = Done; } break; case Coms: isSave = false; if(c == '/') { currentState = LineCom; } else if(c == '*') { currentState = MulCom1; } else { currentState = Special; unGetNextChar(1); } break; case LineCom: isSave = false; if(c == '\n') { currentState = Done; } break; case MulCom2: isSave = false; if(c == '*') { currentState = MulCom2; } else if(c == '/') { currentState = Done; } else { currentState = MulCom1; } break; case Special: if(c == '!' || c == '=' || c == '<' || c == '>') { // if(isSpecialSingle(c)) { currentToken = "" + c; currentState = Done; isSave = false; } else { currentToken = "Error"; currentState = Done; } break; default: System.out.println(lineNum + " >> Scanner Bug : state = " + currentState); currentState = Done; currentToken = "Error"; break; } if(isSave) { tokenStr += c; } if(currentState == Done) { currentToken = tokenStr; printToken(currentToken); } } return currentToken; }
运行结果如下:
待翻译代码:
#include"iostream.h"
main()
{
int i;
cin>>i;
i=i+1;
if(i>=3) cout<<"chenggong";
elsecout<<"shibai";
}
显示结果:
需要源码的朋友
0 0
- 词法分析器设计
- mixer: sql词法分析器设计
- 词法分析器设计与实现
- HTML词法分析器的设计及其应用
- passcal语言的词法分析器设计
- PL/0 词法分析器设计 c语言
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- 词法分析器
- gem install 失败的解决办法
- JavaEE基础——JavaBean和数据库元数据编程
- go 语言的了解
- 三道DP(水)——不收FLAG系列
- 【bzoj2802】[Poi2012]Warehouse Store 贪心+堆
- 词法分析器设计
- 软件开发技术:基于浏览器的集成测试
- 触发器_mysql
- 语法分析器(java)
- NS2下的NS_AF_NONE, NS_AF_ILINK, NS_AF_INET解释
- 数据结构之二叉树
- BZOJ 2631: tree|动态树
- 4318: OSU! 概率与期望DP
- 【BZOJ1026】[SCOI2009]windy数【数位DP】