一个简单的词法分析器

原创 2016年05月31日 18:04:03

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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

深入浅出编译原理-4-一个简单词法分析器的C语言实现

引言 光说不练,假把式。 此小节来做一个实验,用c语言自己实现一个简单的词法分析器,来加深对词法分析的理解。感兴趣的就自己分析一下源码吧,挺简单的,就没画流程图,请见谅。闲言少叙,我们开始吧。 ...

一个简单词法分析器的C语言实现

一个简单词法分析器的C语言实现 1.1实验描述 例如:对源程序: begin x:=9: if x>9 then x:=2*x+1/3; end # 的源文件,...

一个简单词法分析器的实现代码(java实现)

http://www.cnblogs.com/xuqiang/archive/2010/09/21/1953501.html Main.java /* * 主程序 */ import j...

C语言实现一个简单的词法分析器

此程序是针对Pascal语言文集所做的一个词法分析器,也是兰州大学编译原理实验课所要求的。 由于Pascal语言结构严谨,层次清晰,语法与C语言接近,也便于理解,因此本实验抽取Pascal语言的一个子...

一个简单的的词法分析器!

  • 2010年12月18日 23:55
  • 1.2MB
  • 下载

java 一个简单的词法分析器

  • 2015年11月26日 08:25
  • 4KB
  • 下载

3.2.5.9 写一个词法分析器

词法分析器或者叫扫描器主要用来分析字符串的文本,然后把文本里组成的单词分析出来,识别为某一类型的属性。对于编写编译器或者解析器的第一步工作就是做这样的事情:词法分析。以前有很多种使用字符串搜索的办法,...

一个简单的词法分析器

  • 2009年11月14日 20:39
  • 212KB
  • 下载

c语言词法分析器的简单实现

前不久编译原理学习了词法分析,自己实现了一个简单的c语言词法分析器,来加深对词法分析器原理,状态转换图,有限自动机的理解。当我们想在电脑上运行一个c语言程序时,都要将源程序进行编译。编译简单来说就是将...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的词法分析器
举报原因:
原因补充:

(最多只允许输入30个字)