开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 2

NULL/JavaScript-compiler

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
标签 (2)
master
v1.2.0
v1.1.0
master
分支 (1)
标签 (2)
master
v1.2.0
v1.1.0
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
标签 (2)
master
v1.2.0
v1.1.0
JavaScript-compiler
/
src
/
parser
/
exprParser.ts
JavaScript-compiler
/
src
/
parser
/
exprParser.ts
exprParser.ts 4.58 KB
一键复制 编辑 原始数据 按行查看 历史
jacksplwxy 提交于 2020年04月28日 17:57 +08:00 . 增加中间码和目标代码
import { Expr, FunctionCallExpr, AssignExpr } from './expression'
import { Parser } from './parser'
import { IToken } from '../tokenizer/tokenizer'
import { Terminal, Identifier } from './terminal'
//表达式parser
export class expressionParser {
//优先级序列表
readonly PRIORITY_TABLE = {
'+': 60,
'-': 60,
'*': 70,
'/': 70,
'>=': 80,
'<=': 80,
'>': 80,
'<': 80,
'&&': 90,
'||': 90,
'==': 100,
'!=': 100,
'(': 1000,
')': 1000
}
constructor(private parser: Parser) { }
//表达式解析方法
public exprParser(): (Expr | Terminal) {
if (this.parser.lookahead.value === ')') {
return null
}
// PreOrder : 前序
// inOrder : 中序
// PostOrder : 后序
return this.constructAST(this.inOrderToPostOrder())
}
//构建AST:abcd+*+ → ab(c+d)*+ → ab*(c+d)+ → a+b*(c+d)
private constructAST(postOrderOutput: Array<IToken | Terminal | Expr>): (Expr | Terminal) {
const stack = []
for (let i = 0; i < postOrderOutput.length; i++) {
const current: (IToken | Terminal | Expr) = postOrderOutput[i]
if ((<IToken>current).type === 'operator') {
const r: (Terminal | Expr) = stack.pop()
const l: Identifier = stack.pop()
const expr: Expr = new Expr((<IToken>current).value, l, r)
stack.push(expr)
} else {
stack.push(current)
}
}
return stack[0]
}
/**
* 帮助Pop Stack直到Prediction满足
* @param {*} stack
* @param {Lambda} prediction
* @param {*} callback
*/
private popUntil(stack: Array<IToken>, prediction: (token?: IToken) => boolean, callback: (token?: IToken) => void): void {
let token: IToken = null
while (token = stack.pop()) {
if (prediction(token)) {
stack.push(token)
break
}
callback(token)
}
}
/**
* 后序遍历实现表达式优先级算法:中序表达式a+b*(c+d)的转换后序表达式abcd+*+
*/
private inOrderToPostOrder(): Array<IToken | Terminal | Expr> {
const opStack: Array<IToken> = []
const output: Array<IToken | Terminal | Expr> = []
while (this.parser.lookahead.value != 'eof' && this.parser.lookahead.value !== '}') {
if (this.parser.lookahead.value === '(') {
opStack.push(this.parser.lookahead)
this.parser.match('(')
} else if (this.parser.lookahead.value === ')') {
this.popUntil(opStack, (token: IToken) => token.value === '(', (token: IToken) => {
output.push(token)
})
const op: IToken = opStack.pop()
// 遇到没有左括号匹配的情况意味着需要停止处理
if (!op || op.value !== '(') {
break
}
this.parser.match(')')
if (this.parser.lookahead.type != 'operator') {
break
}
} else if (this.parser.lookahead.type === 'operator') {
const op: IToken = this.parser.lookahead
if (!(op.value in this.PRIORITY_TABLE)) {
throw `An operator expected in @line ${this.parser.lookahead.lineNo} but ${this.parser.lookahead.value} found`
}
this.parser.match(op.value)
const lastOp: IToken = opStack[opStack.length - 1]
if (!lastOp) { // opStack是空的
opStack.push(op)
} else {
if (this.PRIORITY_TABLE[op.value] <= this.PRIORITY_TABLE[lastOp.value]) {
this.popUntil(opStack, (token: IToken) => !token || token.value === '(', (token: IToken) => {
output.push(token)
})
}
opStack.push(op)
}
} else {
const factor: (Terminal | Expr) = this.parser.parseFactor()
output.push(factor)
if (this.parser.lookahead.type != 'operator' || this.parser.lookahead.value === '=') {
break
}
}
}
//op栈出栈存入结果栈中
if (opStack.length > 0) {
while (opStack.length > 0) {
output.push(opStack.pop())
}
}
return output
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

编译器教程,使用TypeScript实现一款简易JavaScript编译器
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/delete_user/JavaScript-compiler.git
git@gitee.com:delete_user/JavaScript-compiler.git
delete_user
JavaScript-compiler
JavaScript-compiler
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /