精华内容
下载资源
问答
  • 语法树
    千次阅读
    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 有不少工具可以把代码构造出清晰的语法树,比如esprimav8SpiderMonkeyUglifyJSAST explorer等。

    这里,我使用「esprima」来探讨一下JavaScript运算(1 + 2) * 3的语法树。

    body表示程序体,而程序体中包含了一则表达式ExpressionStatement, 表达式体里包含了操作符 *,以及左右两边表达式,其中右边是数字3,而左边表达式还包含一层表达式,里面是一个+ 操作符,以及左右两边分别为12的数字。

    javascript语法树.png

    如果还没有看懂,你可以到这里看一下这段代码所生成的语法树:AST for (1 + 2)* 3;

    我们可以利用语法树做些什么?

    看到这里你可能会问,知道语法是又有什么用呢?跟我日常编写代码貌似半毛钱关系都没有。其实语法树还是很有用的,想一下如果想做「语法高亮」、「关键字匹配」、「作用域判断」、「语言转换」以及「代码压缩」等等,都是最好把代码解构成语法树之后再去各种操作,当然仅仅解构还不够,还需要提供各种函数去遍历与修改语法树。

    另一方面,去研究、去探讨计算机真实的世界不是一个很精彩很刺激的过程么?

    更多相关内容
  • 在计算机科学中,抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之...
  • 本文分析了PHP7新特性之抽象语法树(AST)带来的变化。分享给大家供大家参考,具体如下: 这里大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abstractsyntaxtree,为了易于理解从源文档中节选部分...
  • 快速React 使用react渲染抽象语法树如果您认为它有用,请★此回购★★★★ 本质上,抽象语法树很难使用。 这是一个React渲染器,使与抽象语法树进行交互并轻松渲染代码。 React AST是使用React渲染抽象语法树的最终...
  • 生成命令的抽象语法树(AST)。 根据Bash引用规则的子集标记给定命令 检测格式错误的命令 , 为什么 主要是这样写的: 作为编写基于严格语法规则的解析器的练习 作为一个从头开始构建Bash外壳的大型项目的一部分 ...
  • 自定义抽象语法树JSON模板
  • 使用java编写的编译原理的最左推导、最右推荐、以及其语法树,代码存在bug,部分用例会出现问题
  • C++语言的语法分析器,代码借助yacc和lex,实现了语法书的生成及展示
  • react-ast使用react渲染抽象语法树。如果您发现它有用,请★此仓库★★★本质上很难使用抽象语法树。 这是一个React渲染器,它可以使用react与Abstrac react-ast交互来渲染抽象语法树。如果您发现它有用,请★此仓库...
  • 针对SQL注入攻击,将基于SQL语法树比较的安全策略引入用户输入过滤的设计中,提出了一种新的SQL注入过滤方法。实验结果表明,该方法能够有效地防止SQL注入攻击,并有较高的拦截率和较低的误报率。
  • 编译原理语法树的实现~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • mdast:Markdown抽象语法树格式
  • 使用C++开发一个小型的C语言编译器,实现词法分析,语法分析,语法制导翻译,语义分析和中间代码生成。 数据结构都是使用的C++ STL,语法分析使用的LR(1)分析法。
  • 罗斯林·夸特(RoslynQuoter) 用于给定C#程序的Roslyn工具显示了语法工厂API调用以构造其语法树。 可以通过以下网址进行实时试用: : 。
  • 实现了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; 已得到语法树 编写程序,遍历语法树,执行代码,得到正确结果。
  • 具体语法树 定义标准JavaScript CST(具体语法树)以补充AST。 问题 标准格式仅包含被认为对于有效执行JS程序所必需的信息。 解析这个格式明确地丢弃某些“不必要”的信息,如评论,空白,或许忽略语法格式,如:...
  • esgraph, 从esprima抽象语法树创建控制流图 esgraph从esprima抽象语法树创建控制流图 安装$ npm install esgraph用法 esgraphesgraph 二进制读取从stdin读取并输出由graphviz使用的dot格式。
  • 编译原理语法树,编译原理实验,bison,flex
  • 针对代码抄袭及软件盗版现象,研究了3种传统基于程序结构相似性检测方法,并提出一种基于语法树的程序相似度检测方法。该方法先对源程序进行语法分析得到其语法树,然后基于语法树重点分析源程序的语法结构并计算其...
  • TypeScript语法可视化器 受Roslyn语法可视化工具的TypeScript启发的简单gui。 它使用TypeScript本身来获取语法树
  • 通过设计、开发一个高级语言的LL(1)语法分析程序,实现 对源程序的语法检查和结构分析,括自顶向下语法分析、First集、Follow集、Select集、文法等价变换)的理解,提高语法分析方法的实践能力。
  • ASTExtractor:Java语法的抽象语法树提取器 ASTExtractor是基于Eclipse编译器的Java源代码的抽象语法树(AST)提取器。 该工具充当Eclipse编译器的包装器,并允许以XML和JSON格式导出源代码文件或项目的AST。 该工具...
  • -这时你需要懂得抽象语法树(AST)。 AST在日常业务中也许很难涉及到,但当你不止于想做一个工程师,而想做工程师的工程师,写出类似webpack,vue-cli前端自动化的工具,或者有批量修改源码的工程需求,那你必须...
  • js语法树jsSyntaxTree是一个Web应用程序,可通过以带括号的符号输入的短语创建语法树图。 jsSyntaxTree生成的图可用于语言作业,作业和其他文档。 有关许可证信息,请参阅LICENSE文件。 可以在Web上使用jsSyntaxTree...
  • 编译原理及实现技术:7.语法分析__语法树、二义性文法.ppt
  • 编译原理语法树,编译原理实验,bison,flex

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 264,201
精华内容 105,680
关键字:

语法树