一个简单的词法分析器
来源:互联网 发布:优行科技 知乎 编辑:程序博客网 时间:2024/06/06 02:47
input.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <link rel="stylesheet" type="text/css" href="style.css"> <title>Input</title></head><body><h1>简单词法分析器</h1><p>输入源程序:</p><textarea id="input" rows="10" cols="50"></textarea><br><button id="analysis" type="button" onclick="analysis()">分析</button><script type="text/javascript" src="analyzer.js"></script><pre id="output"> </pre></body></html>
analyzer.js
var state = 0;var str = "";var result = "";var countdot = 0;var counte = 0;var line = 1;//判断字母function isChar(ch) { return (ch<='z')&&(ch>='a')||(ch<='Z')&&(ch>='A')&&(ch!='e');}//判断数字function isDigit(ch){ return (ch>='0')&&(ch<='9');}//判断运算符function isOperator(ch) { return ch=="+"||ch=="-"||ch=="*"||ch=="/"||ch=="%"||ch=="="||ch=="<"||ch=="<";}//判断界符function isDelimiter(ch){ return ch==","||ch==";"||ch=="("||ch==")"||ch=="/*"||ch=="*/"||ch=="{"||ch=="}";}//判断空格function isSpace(ch){ return ch==' ';}//判断关键字function isKey(str) { return str=="int"||str == "for"||str == "if"||str == "else"||str == "while"||str == "do"||str == "float"|| str == "switch"||str == "case"||str == "default"||str=="char"||str=="void";}//判断下划线function isUnderline(ch) { return ch=="_";}//判断美元符号function isDollar(ch) { return ch=="$";}//判断小数点function isdotted(ch) { return ch==".";}//判断科学计数法function ise(ch) { return ch=="e";}//判断换行function isEnter(ch) { return ch=="\n";}/* * 0:状态初始化 * 1:关键字 * 2:变量 * 3:数字 * 4:字符串 * 5:运算符 * 6:界符 * */function analysis(){ line = 1; result = ""; countdot = 0; counte = 0; var s = document.getElementById("input").value; for(var i=0;i<s.length;i++) { //console.log(s.charAt(i)); var ch = s.charAt(i); switch (state){ case 0: if(isChar(ch)||isDollar(ch)||isUnderline(ch)){ str = "" + ch; state = 1; } else if(isDigit(ch)){ str = "" + ch; state = 3; } else if(ch == '\"'){ str = ""; state = 4; } else if(isOperator(ch)){ str = "" + ch; state = 5; //console.log("<operator:"+ch+">"); result = result + "<operator:"+ch+">" + "\n"; state = 0; } else if(isDelimiter(ch)){ str = "" + ch; state = 6; //console.log("<delimiter:"+ch+">"); result = result + "<delimiter:"+ch+">" + "\n"; state = 0; } else if(isEnter(ch)){ line++; } break; case 1: if(isChar(ch)||isDigit(ch)||isUnderline(ch)){ str = str +ch; }else if(isDelimiter(ch)||isOperator(ch)||isSpace(ch)){ if(isKey(str)){ result = result + "<key:"+str+">" + "\n"; }else{ result = result + "<var:"+str+">" + "\n"; } i--; state = 0; }else{ result = result + "<error:"+str+"> " + line + "\n"; i--; state = 0; } break; case 3: if(isDigit(ch)){ str = str + ch; }else if(isdotted(ch)){ countdot++; if(countdot<2) str = str + ch; else result = result + "error " + line ; }else if(ise(ch)){ counte++; if(counte<2) str = str + ch; else result = result + "error " + line ; } else if(isDelimiter(ch)||isOperator(ch)||isSpace(ch)){ result = result + "<number:"+str+">" + "\n"; i--; state = 0; }else{ result = result + "<error:"+str+"> " + line + "\n"; i--; state = 0; } break; case 4: if(ch == '\"'){ //console.log("<string:"+str+">"); result = result + "<string:"+str+">" + "\n"; state = 0; }else{ str = str + ch; } break; } } var o = document.getElementById("output"); o.lastChild.nodeValue = result; }
style.css
body{ font-family: sans-serif;}h1{ color:#699;}#output{ color: blue; font-family: sans-serif; font-size: 16px;}#input{ color: red; font-family: sans-serif; font-size: 16px;}
0 0
- 一个简单的词法分析器
- 一个简单词法分析器的实现代码
- 一个简单C语言的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单的词法分析器
- 简单词法分析器的实现
- 最简单的词法分析器
- c语言词法分析器的一个简单实现
- 一个简单词法分析器的实现代码(java实现)
- 一个简单词法分析器的实现代码(java实现)
- 一个简单词法分析器的C语言实现
- C语言实现一个简单的词法分析器
- 一个词法分析器的流程图
- 一个加减乘除的词法分析器
- log4j:WARN No appenders could be found for logger (org.quartz.simpl.SimpleThreadPool)
- 冒泡排序算法及其优化
- finished with non-zero exit value 3
- 深入浅出Mybatis系列(五)---TypeHandler简介及配置(mybatis源码篇)
- 【Linux运维入门】PSSH-轻量集群管理工具
- 一个简单的词法分析器
- 解决android系统唤醒时间偏长------healthd里的一些调用
- Android第三方推送(基于JPush极光)
- linux shell简单实现数据库自动备份
- 【BZOJ1649】[Usaco2006 Dec]Cow Roller Coaster【背包DP】
- token是为了防止表单重复提交
- 图的最小生成树之Prim算法
- 第10周 C语言程序设计(新2版) 3.5例题 函数atoi(s),将字符串转换为对应数值
- 【简介】利用Arduino和Coolpy设计网关 —— HTTP协议