>_
When 表达式实验室
Interpreter learning prototype
本地运行 · 无网络依赖
源码仓库

看见表达式如何被执行

从一条 VS Code when 表达式出发,沿着词法分析、优先级转换和求值栈,逐步拆开一个简单解释器。

步骤 01 / 04输入表达式
01 · Input

输入一条表达式

7 tokens

When 语法速查

以下为本实验室支持的语法子集,并非完整的 VS Code when 语法。变量从运行上下文取值,最终结果转换为布尔值。

!逻辑非:!isMac
&&逻辑与:isMac && !isWin
||逻辑或:isMac || isWin
==相等:editorLangId == 'typescript'
===严格相等:editorLangId === 'typescript'
!=不相等:editorLangId != 'javascript'
!==严格不相等:editorLangId !== 'javascript'
>大于:workspaceFolderCount > 0
>=大于等于:workspaceFolderCount >= 1
<小于:workspaceFolderCount < 2
<=小于等于:workspaceFolderCount <= 1
in数组包含:resourceFilename in supportedFolders
not in数组不包含:resourceFilename not in supportedFolders
=~正则匹配:resourceScheme =~ /file/
( )分组:isMac && (workspaceFolderCount > 0)
变量isMac;名称以字母或下划线开头,后接字母、数字或下划线
数字0、1、1.5;支持非负整数和小数
字符串'typescript'、'hello world';使用单引号
正则/file/、/^readme/;用斜杠包围,不支持 flags

优先级从高到低:!、比较 / in / not in / =~、&&、||。括号优先;连续 ! 从右向左结合。

此实现中 == 与 === 均为严格相等,!= 与 !== 均为严格不相等;in 和 not in 的右侧必须为数组,否则返回 false。数组由上下文提供,表达式内不支持数组字面量。true / false 按变量名解析,布尔值应在上下文中设置。字符串和正则定界符不支持转义。

表达式引用的变量必须存在于当前上下文。

Pipeline

解释器流程

可逐步观察