8000 GitHub - xk11961677/sky-antlr4-demo
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

xk11961677/sky-antlr4-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 

Repository files navigation

antlr4 demo

功能 todo

  1. 三目运算、算术运算、关系运算、逻辑运算等拆分
  2. 支持JSON解析并计算,用于管理端配置各种规则,后端计算
  3. 支持自定义函数、作用域、生存期
  4. 异常策略
  5. 表达式校验

名词

  • 字面量、关键字、标识符、操作符、比较符、保留字、空白字符
  • 正则文法、有限自动机[FSA(DFA、NFA)]、状态迁移
  • 上下文无关文法、BNF、递归下降算法、左递归、优先级、结合性
  • 二义性、推导
  • 表达式语句、赋值语句、控制语句、循环语句、块
  • 作用域、生存期、类型推导(Type Inference)、类型检查(Type Checking)、类型转换(Type Conversion)、引用消解

名词解释

  • 文法:是一组规则,用以描述如何将文本流转化为语法树
  • 词法分析:将程序分析为一个个Token的过程,可以使用有限自动机实现
  • 语法分析:将程序的结构识别出来,并形成便于计算机处理的抽象语法树,可以使用递归下降算法实现
  • 语义分析:将消除语义模糊,生成一些属性信息,让计算机能够依据这些信息生成目标代码
  • 词法原理:就是依据构造好的有限自动机,在不同的状态中迁移,从而解析出Token
  • 语义分析的本质:就是针对上下文相关的情况做处理
  • 上下文无关文法:一个有穷的非终结符(或变元)的集合、一个有穷的终结符的集合、一个有穷的产生式集合、一个起始非终结符(变元)。符合这四个特点的文法规则就是上下文无关文法。两种描述形式:一种是巴科斯范式(BNF),另一种是巴科斯范式的一种扩展形式(EBNF),它更利于自动化生成语法分析器。其中,产生式、终结符、非终结符、开始符号是巴科斯范式的基本组成要素。
  • BNF:巴科斯范式,antlr和yacc工具
  • EBNF:扩展巴科斯范式, 在BNF基础上混合类似正则的写法
  • 优先级:通过在语法推导中的层次来决定的,优先级越低的,越先尝试推导。一般从低到高,赋值运算 -> 逻辑运算 -> 关系运算 -> 算数运算 -> 基础表达式,而改变优先级方法可以在 基础表达式 后增加带括号的可选择表达式,如 | ( exp )
  • 结合性:操作符计算是从左向右计算还是从右向左计算,就是结合性。如 1+2+3 正常计算属于左结合,而 x=y=10 属于右结合。左结合运算符递归项放在左边,右结合运算符递归项放在右边。
  • 二义性:按语法规则能对导出两个语法树,一般修改语法规则解决或者语法分析工具存在类似LL算法解决
  • 递归下降算法:属于自顶向下语法分析思想
  • LL算法:深度优先算法
  • LR算法:深度优先算法
  • 左递归:在二元表达式的语法规则中,如果产生式的第一个元素是它自身,那么程序就会无限地递归下去,这种情况就叫做左递归。比如加法表达式的产生式“加法表达式 + 乘法表达式”,就是左递归的
  • FSA:分为确定的有限自动机(DFA)和非确定的有限自动机(NFA)

anrlt4

  • 优先级自上而下降低
  • 默认左结合,而右结合需要使用 运算符<assoc=right>
  • 直接左递归可以处理,间接左递归无法处理。如
expr : expr '+' expr    // 匹配由“+”运算符连接的子表达式
     | expr '*' expr 
5CB9
   // 匹配由“*”运算符连接的子表达式
     | INT            // 匹配简单整数
     ;
     
expr : expo ;    // 通过expo左递归地间接调用expr,无法处理
expo : expr '^'<assoc=right> expr ;

文法,英文叫做Grammar,是形式语言(Formal Language)的一个术语。 所以也有Formal Grammar这样的说法。这里的文法有定义清晰的规则。 比如,我们的词法规则、语法规则和属性规则,使用形式文法来定义的。 我们的课程里讲解了正则文法(Regular Grammar)、上下文无关文法(Context-free Grammar)等不同的文法规则,用来描述词法和语法。 语法分析中的这个语法,英文是Syntax,主要是描述词是怎么组成句子的。一个语言的语法规则,通常指的是这个Syntax。 问题是,Grammar这个词,在中文很多应用场景中也叫做语法。这是会引起混淆的地方。我们在使用的时候要小心一点就行了。 比如,我做了一个规则文件,里面都是一些词法规则(Lexer Grammar),我会说,这是一个词法规则文件,或者词法文法文件。 这个时候,把它说成是一个语法规则文件,就有点含义模糊。因为这里面并没有语法规则(Syntax Grammar)。

正则文法、有限自动机 -> 上下文无关文法 EBNF、自定向下递归下降算法、优先级、结合性、左递归 -> 上限文相关性、类型

附录

antlr4语法规则示例

JS生成AST网站

antlr学习资料

语法分析算法讲解01

语法分析算法讲解02

编译原理

antlr权威指南


About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
0