1. 程式人生 > >JS詞法分析器實驗報告

JS詞法分析器實驗報告

1.實驗環境

Linux系統  WebStorm環境

2.實驗目的

設計、編制、除錯一個詞法分析子程式-識別單詞,加深對詞法分析原理的理解

3.單詞分類表

4.單詞狀態表

5.演算法描述

用Javascipt實現詞法分析器,首先是讀取檔案,然後把讀入的字元轉為陣列形式,遍歷陣列。

如果讀到字母,就讀完餘下連續的字母或數字,然後以此與關鍵字表中元素進行對比,如果是關鍵字輸出該關鍵字的序列號與關鍵字,如果不是關鍵字再與標示符中的元素對比,如果標示符中存在則輸出該標示符的序列號與標示符,如果不存在則加入標示符陣列且輸出序列號與該字元。

如果讀到是數字則讀完餘下的數字,輸出num與該數字。

讀到的若是符號則與符號陣列對比輸出該符號的序列號與符號。

若不在以上的範圍內則輸出0。

6.程式結構

8.執行結果


9.除錯情況

開始的時候在讀檔案時,讀到裡檔案可是後面的程式碼呼叫檔案為undefine,後來除錯裡很長時間才明白是出現非同步情況,所以就修改了程式碼的整體結構,讀完檔案直接呼叫,都放在了一個迴圈裡面。

10.設計技巧及體會

設計技巧:讀到資料直接輸出更為方便,放在數組裡最後統一輸出反而更麻煩而且容易出錯。

體會:寫了很久的詞法分析器,從開始的懵懵懂懂到現在已經徹底明白,寫程式碼的過程中遇到了很多麻煩,從開始的讀檔案到遍歷以及最後的輸出都不是很順利,一邊邊的測試打斷點,最後總算完成,很開心。

11.源程式清單

程式碼檔案:

var 
fs = require('fs'); function allNames() { var ch = ''; var text; var sertID = ['var', 'function', 'if', 'else', 'return', 'true', 'false']; var dotID = [',', '(', ')', '{', '}','\'',':'] var sertConst = []; fs.readFile('input.js', 'UTF-8', function (err, data) { text
= data.toString().split(''); for (var i = 0; i < text.length;) { var strToken = ''; ch = text[i]; var tag = 0; if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { strToken += ch; i += 1; ch = text[i]; } for (var j = 0; j < sertID.length; j++) { if (sertID[j] === strToken && tag === 0) { console.log(strToken, 'sertID' + j) tag = 1; } } if (sertConst.length === 0 && tag === 0) { sertConst.push(strToken); console.log(strToken, 'sertConst' + 0) tag = 1; } if (sertConst.length != 0 && tag === 0) { for (var t = 0; t < sertConst.length; t++) { if (sertConst[t] === strToken && tag === 0) { tag = 1; console.log(strToken, 'sertConst' + t) break; } else { sertConst.push(strToken); tag = 1; var put = sertConst.length - 1 console.log(strToken, 'sertConst' + put) break; } } } } else if (ch >= '0' && ch <= '9') { while (ch >= '0' && ch <= '9') { strToken += ch; i += 1; ch = text[i]; } console.log(strToken, 'num') tag = 1; } for (var d = 0; d < dotID.length; d++) { if (dotID[d] === ch) { console.log(ch, 'dotID' + d) i++; tag = 1; break; } } if (tag === 0) { console.log('0'); i++; } } } ) } allNames()
被讀檔案:
function put(){
    return 'hello'}