一个简单的词法分析器

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

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

简单词法分析器的实现

这是我们的一次编程作业,要求用C编写一个简单的词法分析器。要求如下: 编制一个单词获取程序,从文件输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、整数、小数、字符串、分隔符、运算符等...
  • abc12580
  • abc12580
  • 2016年04月05日 18:59
  • 352

最简单的词法分析器

1、 实验目的: 设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。   2、 实验要求 (1) 允许用户自己输入源程序并保存为文件 (2) 系统能够输出经过...
  • weailily
  • weailily
  • 2016年05月09日 20:29
  • 3792

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

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

简易词法分析器

当我们写好一段代码之后,我们通常的操作是:编译,链接, 执行。 而在编译阶段,我们的编译器就会进行词法分析这个阶段,来分析有没有词法错误。 而单词符号一般分为五大类: 1.关键字,也称保留字,比...
  • turn__back
  • turn__back
  • 2016年06月12日 16:42
  • 2186

java实现简单的词法分析器

package com; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOExce...
  • u012188794
  • u012188794
  • 2014年11月17日 21:22
  • 924

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

词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。 要实现的词...
  • ben_xiao_hai
  • ben_xiao_hai
  • 2014年08月13日 12:29
  • 3590

简单词法分析器java版本

Error为错误提示类,将错误信息保存在Error中。用于输出error.txt Word为关键字定义,将关键字信息保存在Word中,用于对单词的验证 Lexer 为词法分析核心类,包含对源程序的分析...
  • jlh912008548
  • jlh912008548
  • 2016年05月31日 20:35
  • 2694

实验一 词法分析器

一、实验目的   (1)理解词法分析在编译程序中的作用;   (2)加深对有限自动机模型的理解;   (3)掌握词法分析程序的实现方法和技术。    二、开发语言及实现平台或实验环境       操...
  • a593547438
  • a593547438
  • 2014年03月29日 15:54
  • 1489

词法分析器设计

词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。程序语言的单词符号一般分为五种:关键字(保留字/基本字)if、whil...
  • l450741881
  • l450741881
  • 2016年02月25日 07:50
  • 955

[编译原理] 简单的词法分析器

本文是网易云课堂中国科学技术大学华保健老师教授的《编译原理》课程习题。 1 题目 在这部分中,你将使用图转移算法手工实现一个小型的词法分析器。 分析器的输入:存储在文本文件中的字符...
  • jitianyu123
  • jitianyu123
  • 2017年06月19日 15:13
  • 726
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的词法分析器
举报原因:
原因补充:

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