Skip to content

lpuls/UnU

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UnU

  1. 基于C++编写的动态语言
  2. 该仓库有两个分支:fixed和master,其中fixed作为大学毕设时开发的,而master则是后来以flex和yacc开发的。
  3. 前者以开发完成,支持整型,浮点型和字符串型的定义和运算,后者虽然时间原因,只进行了初始的开发。

fixed分支


文件结构

  1. FileReader, Log, TypeConversion文件主要作为工具类,用以读取文件,打印日志及类型转换
  2. FiniteState则保存自动状态机类相关的代码
  3. Jsons为配置文件,如词法匹配规则
  4. UnUCompiler为解释器的前端  1. AST文件保存着AST节点的类  2. Lex保存存词法分析所需的相关文件  3. Parser保存着语法分析所需的相关文件  4. Smantic文件保存着语义分析所需要的相关文件
  5. UnU保存着解释器的后端代码,既解释器的内部实现,如while,function等

原理说明

  1. 语义分析和语法分析,二者皆由有限自动状态机实现,通过读取json配置文件,来决定语法和语法规则,再对输入源进行分析。最终词法分析的结果会作为语法分析的输入,而语法分析在确认语法正确的同时,会生成抽像语法树(AST),该结果将作为语义分析及最终代码生成的输入。
  2. 语义分析以AST作为输入,能过遍历树结构确认是否存在语义错误,该步聚除了语义分析的部份代码外,还在最终代码生成的过程中执行。
  3. 最终代码生成,以AST为依据,在初步确认没有语义错误时,会生成UnU节点,该节点为语言的实际执行者,在运行的同时会进行语义分析过程中无法进行的语义检查并执行操作

master分支


文件结构

  1. LEX文件夹下,存放着flex的输入文件lex.l及输出文件lex.cpp,其中lex.cpp是执行词法分析的工具
  2. PARSER文件夹下,存放着yacc的输入文件及输出文件parse.cpp及parse.h,其输出文件用于执行语法分析的工具
  3. Tools存放着开发过程中所需要的部份工具类
  4. AST文件夹下存放着AST的节点类

原理说明

  1. 词法分析通过lex.l文件制定词法规则,并通过Flex生成.cpp文件,该文件为进词法分析的主要代码.在分析输入代码时,通过定义在每种词汇后面的C语言来执行特殊操作,如记录行号或将其值传给语法分析器
  2. 语法分析通过parse.y文件制定语法规则,并通过yacc -d的指定生成.h和.cpp文件;语法分析过程中,会执行每个语法推导后面的C语言代码,该代码将得到的每个语法结点进行组织,生成了AST

About

基于C++编写的动态语言

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published