Skip to content

Instantly share code, notes, and snippets.

@JeOam
Created August 10, 2016 13:25
Show Gist options
  • Save JeOam/2204c320051103cf82c4397169f73969 to your computer and use it in GitHub Desktop.
Save JeOam/2204c320051103cf82c4397169f73969 to your computer and use it in GitHub Desktop.
自制编程语言
@JeOam
Copy link
Author

JeOam commented Aug 10, 2016

一般编程语言的语法处理,都会有以下的过程:

  1. 词法分析: 将源代码分割为若干个记号(token)的处理。
  2. 语法分析: 即从记号构建分析树(parse tree)的处理。分析树也叫作语法树(syntax tree)或抽象语法树(abstract syntax tree,AST)。
  3. 语义分析: 经过语法分析生成的分析树,并不包含数据类型等语义信息。因此在语义分析阶段,会检查程序中是否含有语法正确但是存在逻辑问题的错误。
  4. 生成代码: 如果是C语言等生成机器码的编译器或Java这样生成字节码的编译器,在分析树构建完毕后会进入代码生成阶段。

执行词法分析的程序称为词法分析器(lexical analyzer)。lex 的工作就是根据词法规则自动生成词法分析器。
执行语法分析的程序则称为解析器(parser)。yacc 就是能根据语法规则自动生成解析器的程序。

@JeOam
Copy link
Author

JeOam commented Aug 14, 2016

  • 如果环境无法直接运行 yacc,可以使用 GNU 项目提供的 bison
  • 如果环境无法直接运行 lex,可以使用lex的免费版 flex

Instal flex and yacc on OS X:

brew install flex
brew install bison

编译 mycalc 项目:

$ bison --yacc -dv mycalc.y  #  生成 y.output y.tab.c  y.tab.h 文件
$ flex mycalc.l  # 生成 lex.yy.c 文件
$ cc -o mycalc y.tab.c lex.yy.c
$ ./mycalc
... 1+1
>>2.000000

@JeOam
Copy link
Author

JeOam commented Aug 28, 2016

Valgrind is an instrumentation framework for building dynamic analysis tools. There are Valgrind tools that can automatically detect many memory management and threading bugs, and profile your programs in detail. You can also use Valgrind to build new tools.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment