-
2021-05-12 01:18:45
下图为一个表达式的语法树,该表达式的后缀形式为 ( A) A. x5y+*a/b- B. x5yab*+/- C. -/*x+5yab D. x5*y+a/b- 何为语法树
什么是语法树?
你是否曾想过,这个世界存在这么多语言的意义。
假如现在你面前有一个物体,它是一个不规则的圆体,整个身体通红,头部还有一根细长稍微弯曲偏右呈棕色的圆柱体。
在中文我们称之为「苹果」,
在英文我们称之为「Apple」,
在日文中我们称之为「アップル」,
在法语中我们称之为「pomme」,
在德语中我们称之为「Apfel」,
无论用不同的语言,针对这个物体在文字上、发音上都完全不一样,但这个物体确确实实的存在这个时空上,颜色、气味、形状都不曾因为语言而改变过。无论这个世界存在多少语言,它们所描述的真理都不曾改变过。
或者说,真理就存在那里,可以用不同的语言的不同表达方式描述出来。那么计算机的世界,这么多编程的语言,C、C++、Java、C#、JavaScript、Python、Go、Ruby等等等,它们共同所描述的真理是什么?
我们知道人类语言上,无论什么语种,都会有「主语」「动词」「宾语」「标点符号」来描述一个现实世界所发生的事件。
而在计算机编程语言上,无论什么语种,都会有「类型」「运算符」「流程语句」「函数」「对象」等概念来表达计算机中存在内存中的0和1,以及背后运算与逻辑。语法树,计算机描述世界真理的树状结构。
不同的语言,都会配之不同的语法分析器,而语法分析器是把源代码作为字符串读入、解析,并建立语法树的程序。语法的设计和语法分析器的实现是决定语言外在表现的重要因素。
什么是语法树?摘自Wiki一段:在计算机科学中,抽象语法树(abstract syntax tree 或者缩写为 AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是「抽象」的,是因为这里的语法并不会表示出真实语法中出现的每个细节。
一则简单的例子
如果我们需要让计算机帮忙算一下 「1加2再乘以3」 的结果,该怎么表达呢?
现在我们大多数的现代编程语言,都是使用「中缀表达式」的方式来编写运算,比如JavaScript:而FORTH语言则使用「后缀表达式」,这基本上与日语中的语序是一致的:
LISP语言使用的「前缀表达式」:
我们再看一下这三种表达式的语法树:
表达式语法树比较.png
可以看出,对于这三种简单的语言,它们只是在这个语法树上按不同的规则遍历而已。三者的代码看起来差别很大,但实际上所用的树结构是相同的。
先来看看Python的语法树
通过Python语言自带的库文件ast,我们可以查看特定的代码被转换成怎样的语法树。
BinOp op = Mult()
表示乘法运算,与*
相对应;BinOp op = Add()
表示加法运算,与+
相对应;Num n = 1
既为数值1。Python语法树.png
再窥视一下JavaScript的语法树
在语法复杂的语言中,语法树是包含很多细节的语法结果表达式,我们需要靠语法树把这种形式以更简洁的形式表达出来。
Javascript 有不少工具可以把代码构造出清晰的语法树,比如esprima、v8、SpiderMonkey、UglifyJS、AST explorer等。
这里,我使用「esprima」来探讨一下JavaScript运算
(1 + 2) * 3
的语法树。body
表示程序体,而程序体中包含了一则表达式ExpressionStatement
, 表达式体里包含了操作符*
,以及左右两边表达式,其中右边是数字3
,而左边表达式还包含一层表达式,里面是一个+
操作符,以及左右两边分别为1
和2
的数字。javascript语法树.png
如果还没有看懂,你可以到这里看一下这段代码所生成的语法树:AST for (1 + 2)* 3;
我们可以利用语法树做些什么?
看到这里你可能会问,知道语法是又有什么用呢?跟我日常编写代码貌似半毛钱关系都没有。其实语法树还是很有用的,想一下如果想做「语法高亮」、「关键字匹配」、「作用域判断」、「语言转换」以及「代码压缩」等等,都是最好把代码解构成语法树之后再去各种操作,当然仅仅解构还不够,还需要提供各种函数去遍历与修改语法树。
另一方面,去研究、去探讨计算机真实的世界不是一个很精彩很刺激的过程么?
更多相关内容 -
浅析AST抽象语法树及Python代码实现
2020-12-24 14:46:43在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之... -
PHP7新特性之抽象语法树(AST)带来的变化详解
2021-01-20 08:02:30本文分析了PHP7新特性之抽象语法树(AST)带来的变化。分享给大家供大家参考,具体如下: 这里大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abstractsyntaxtree,为了易于理解从源文档中节选部分... -
react-ast:使用react渲染抽象语法树
2021-02-01 08:15:19快速React 使用react渲染抽象语法树如果您认为它有用,请★此回购★★★★ 本质上,抽象语法树很难使用。 这是一个React渲染器,使与抽象语法树进行交互并轻松渲染代码。 React AST是使用React渲染抽象语法树的最终... -
stoke:生成Bash命令的抽象语法树(AST)
2021-05-24 19:48:47生成命令的抽象语法树(AST)。 根据Bash引用规则的子集标记给定命令 检测格式错误的命令 , 为什么 主要是这样写的: 作为编写基于严格语法规则的解析器的练习 作为一个从头开始构建Bash外壳的大型项目的一部分 ... -
自定义抽象语法树JSON模板
2020-11-25 23:24:23自定义抽象语法树JSON模板 -
编译原理的最左推导以及最右推导,包含语法树
2021-07-18 22:28:57使用java编写的编译原理的最左推导、最右推荐、以及其语法树,代码存在bug,部分用例会出现问题 -
编译原理 语法分析 语法树生成
2017-12-30 19:43:53C++语言的语法分析器,代码借助yacc和lex,实现了语法书的生成及展示 -
用react渲染抽象语法树-React开发
2021-05-27 15:25:13react-ast使用react渲染抽象语法树。如果您发现它有用,请★此仓库★★★本质上很难使用抽象语法树。 这是一个React渲染器,它可以使用react与Abstrac react-ast交互来渲染抽象语法树。如果您发现它有用,请★此仓库... -
基于SQL语法树的SQL注入过滤方法研究
2021-01-20 05:42:15针对SQL注入攻击,将基于SQL语法树比较的安全策略引入用户输入过滤的设计中,提出了一种新的SQL注入过滤方法。实验结果表明,该方法能够有效地防止SQL注入攻击,并有较高的拦截率和较低的误报率。 -
编译原理语法树的实现
2018-06-04 20:57:48编译原理语法树的实现~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -
mdast:Markdown抽象语法树格式
2021-02-04 11:56:25mdast:Markdown抽象语法树格式 -
LR(1)分析表-语法树-四元式
2018-07-01 16:21:45使用C++开发一个小型的C语言编译器,实现词法分析,语法分析,语法制导翻译,语义分析和中间代码生成。 数据结构都是使用的C++ STL,语法分析使用的LR(1)分析法。 -
RoslynQuoter:Roslyn工具,用于给定的C#程序显示语法树API调用以构造其语法树
2021-04-28 18:06:41罗斯林·夸特(RoslynQuoter) 用于给定C#程序的Roslyn工具显示了语法工厂API调用以构造其语法树。 可以通过以下网址进行实时试用: : 。 -
cCompiler:c语言编译器,用lex和yacc工具完成词法分析与语法分析并生成语法树,C ++实现了语法树的解析并...
2021-01-31 13:40:21实现了C语言除了struct和指针几乎所有的语法。 运行 环境要求:flex bison g ++ 11 python3 中间代码生成 Windows命令行输入: flex compiler.l bison -vdty compiler.y g++ -std=c++11 -o compiler tree.cpp ... -
jsdast:JSDoc抽象语法树
2021-05-09 02:23:02基于Unist规范的语法树JSDoc 安装 $ npm install @geut/jsdast 用法 const unified = require ( 'unified' ) const { parser } = require ( '@geut/jsdast' ) const tree = unified ( ) . use ( parser ) . parse ... -
语法树遍历
2015-11-14 10:42:12尝试设计翻译方法。假定对程序片段已得到语法树,如 if (a > b) b = a; 已得到语法树 编写程序,遍历语法树,执行代码,得到正确结果。 -
concrete-syntax-tree:定义标准JavaScript CST(具体语法树)以补充AST
2021-05-21 08:07:14具体语法树 定义标准JavaScript CST(具体语法树)以补充AST。 问题 标准格式仅包含被认为对于有效执行JS程序所必需的信息。 解析这个格式明确地丢弃某些“不必要”的信息,如评论,空白,或许忽略语法格式,如:... -
esgraph, 从esprima抽象语法树创建控制流图.zip
2019-09-18 09:20:54esgraph, 从esprima抽象语法树创建控制流图 esgraph从esprima抽象语法树创建控制流图 安装$ npm install esgraph用法 esgraphesgraph 二进制读取从stdin读取并输出由graphviz使用的dot格式。 -
编译原理语法树_bison树_flex_语法树_语法树bison_编译原理
2017-12-30 19:43:53编译原理语法树,编译原理实验,bison,flex -
基于语法树的程序相似度判定方法 (2014年)
2021-05-31 23:09:57针对代码抄袭及软件盗版现象,研究了3种传统基于程序结构相似性检测方法,并提出一种基于语法树的程序相似度检测方法。该方法先对源程序进行语法分析得到其语法树,然后基于语法树重点分析源程序的语法结构并计算其... -
TypeScriptSyntaxVisualizer:TypeScript的语法树可视化工具
2021-05-13 15:36:37TypeScript语法可视化器 受Roslyn语法可视化工具的TypeScript启发的简单gui。 它使用TypeScript本身来获取语法树。 -
[编译原理实验]生成语法树,符号表,语义分析C++代码
2019-01-06 09:10:29通过设计、开发一个高级语言的LL(1)语法分析程序,实现 对源程序的语法检查和结构分析,括自顶向下语法分析、First集、Follow集、Select集、文法等价变换)的理解,提高语法分析方法的实践能力。 -
ASTExtractor:Java源代码的抽象语法树提取器-java source code
2021-03-25 07:15:10ASTExtractor:Java语法的抽象语法树提取器 ASTExtractor是基于Eclipse编译器的Java源代码的抽象语法树(AST)提取器。 该工具充当Eclipse编译器的包装器,并允许以XML和JSON格式导出源代码文件或项目的AST。 该工具... -
exportific:抽象语法树(AST)简易教程,附加一个简单的源码编辑工具
2021-03-23 03:29:51-这时你需要懂得抽象语法树(AST)。 AST在日常业务中也许很难涉及到,但当你不止于想做一个工程师,而想做工程师的工程师,写出类似webpack,vue-cli前端自动化的工具,或者有批量修改源码的工程需求,那你必须... -
jssyntaxtree:phpSyntaxTree的动态JavaScript版本-一种从带标签的括号表示法绘制语法树的工具
2021-05-25 07:45:35js语法树jsSyntaxTree是一个Web应用程序,可通过以带括号的符号输入的短语创建语法树图。 jsSyntaxTree生成的图可用于语言作业,作业和其他文档。 有关许可证信息,请参阅LICENSE文件。 可以在Web上使用jsSyntaxTree... -
编译原理及实现技术:7.语法分析__语法树、二义性文法.ppt
2021-09-20 09:45:42编译原理及实现技术:7.语法分析__语法树、二义性文法.ppt -
编译原理语法树,编译原理语法树怎么画,C/C++
2017-12-30 19:43:53编译原理语法树,编译原理实验,bison,flex