js实现编译原理------词法分析器

词法分析器

var inputCode = "int main (){console.log()}"
/*
		 * 规则:
		识别保留字:if、int、for、while、do、return、break、continue;
		单词种别码为1。
		其他的都识别为标识符;单词种别码为2。
		常数为无符号整形数;单词种别码为3。
		运算符包括:+、-、*、/、=、>、<、>=、<=、!= ;单词种别码为4。
		分隔符包括:,、;、{、}、(、); 单词种别码为5。
		 */
var reservedWords = [
  "if",
  "int",
  "for",
  "while",
  "do",
  "return",
  "break",
  "continue",
]
var operators = ["+", "-", "*", "/", "=", "<", ">", "!", ">=", "<=", "!=", "."]
var separators = [",", ";", "{", "}", "(", ")"]
let tokens = Lexical_Analysis(inputCode)

// 循环输出token
for (let index = 0; index < tokens.length; index++) {
     
  console.log(tokens[index])
}

function Lexical_Analysis(str) {
     
  /**
   * current用于标识当前字符位置,
   * str[cur]即为当前字符
   */
  let cur = 0
  /**
   * tokens存储词法分析的最终结果
   */
  let tokens = []

  while (cur < str.length) {
     
    if (/\s/.test(str[cur])) {
     
      // 跳过空格
      cur++
    } else if (/[a-z]/i.test(str[cur])) {
     
      // 读单词
      let word = "" + str[cur++]
      // 测试下一位字符,如果不是字母直接进入下一次循环(此时cur已经右移)
      // 如果是则继续读字母,并将cur向右移动
      while (cur < str.length && /[a-z]/i.test(str[cur])) {
     
        // cur < str.length防止越界
        word += str[cur++]
      }
      if (reservedWords.includes(word)) {
     
        tokens.push({
     
          type: 1,
          value: word,
        }) // 存储保留字(关键字)
      } else {
     
        tokens.push({
     
          type: 2,
          value: word,
        }) // 存储普通单词
      }
    } else if (separators.includes(str[cur])) {
     
      tokens.push({
     
        type: 5,
        value: str[cur++],
      }) // 存储分隔符并将cur向右移动
    } else if (operators.includes(str[cur])) {
     
      let operator = "" + str[cur++]
      if ([">", "<", "!"].includes(operator)) {
     
        // 如果下一个字符是=就添加到operator并再次向右移动cur
        if ((str[cur] = "=")) {
     
          operator += str[cur++]
        }
      }
      tokens.push({
     
        type: 4,
        value: operator,
      }) // 存储运算符
      // 浮点数
    } else if (/^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$/.test(str[cur])) {
     
      let flo = "" + str[cur++]
      // cur < str.length防止越界
      while (cur < str.length && /[0-9]/.test(str[cur])) {
     
        flo += str[cur++]
      }
      tokens.push({
     
        type: 6, //浮点数种别码
        value: flo,
      })
    } else if (/[0-9]/.test(str[cur])) {
     
      let val = "" + str[cur++]
      // cur < str.length防止越界
      while (cur < str.length && /[0-9]/.test(str[cur])) {
     
        val += str[cur++]
      }
      tokens.push({
     
        type: 3,
        value: val,
      }) // 存储整数数字
    } else {
     
      return "包含非法字符:" + str[cur]
    }
  }
  return tokens
}

你可能感兴趣的:(数据结构,正则表达式,字符串,js)