JS - Edgar Hoo Blog

Tag Archives: JS

识别器的实现

本文源自笔者的课程《编译原理》的实验一,原题如下:

假设一个语言允许使用十六进制数,其规定是:必须以数字打头,必须以H结尾,数中允许使用的字母为A,B,C,D,E, F(分别表示10~15)。该语言的标识符为字母开头的字母数字串。试设计一个DFA,使它能识别标识符、无符号的十进制和十六进制整数(假定各单词之间用界限符或空格分开),并编制相应的识别程序。
输入:学生自行确定符号串的输入形式,如键盘输入、文本文件、字符数组等。
输出:标识出规范的符号串与不合规范的符号串。
(来源:海南大学儋州校区计算机系)
要求如下:
A、根据给定的语言求出其文法;
B、将该文法转换成正规式;
C、由正规式构造NFA;
D、将NFA转换成DFA,并将其最小化;
E、根据最小化的DFA编写词法分析程序。
按说这个实验该用C语言编程,但最近学习JavaScript、PHP,正好借此题目练习。
根据题意,笔者认为十六进制整数不含小写字母(包括H),十六进制整数首字符为0的情况下第二字符不能为数字,无符号的十进制整数除0外首字符不能为0。
笔者编JS代码如下:

/*
Item Name: Recognizer of Realize
Description: Compilation Principle Experiment 1st
Version: 1.0
Author: Edgar Hoo
Author URI: http://EdgarHoo.com
Last Updated: Nov. 23, 2008 @ SCUTA
CopyRight 2008 BY-NC-SA
*/
function recog(){
var test = document.myform.mytest.value;// 取得待测字符串
var tl = test.length;// 定义字符串长度
var s=0;// state
for (i=0;i<tl;i++){
 ti = test.charAt(i);// 字符串第i个字符
 if (ti==' ' || ti==' ') s=6;// 去除半角及全角空格
 else {
  switch(s){
    case 0: if (ti==0) s=1;
      else if (ti>=1 && ti<=9) s=2;
      else if [...]