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
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值