编译原理实验

语法分析&词法分析

Task 1
识别词法错误并输出错误信息
要求:
识别八进制&十六进制 不规范报错
识别指数形式浮点数 不规范报错
识别 “//“ “/ /“注释 并过滤

Task2
识别语法错误并输出错误信息

flex使用命令:
(1)flex src.l 对给定的flex文件生成对应的c文件
注:flex对文件的space非常敏感,不要随便在代码里加空格,否则非常可能不能正常输出。
(2)gcc lex.yy.c -ll -o main 编译c文件生成可执行文件,mac下使用-ll
注:因为OSX下的gcc实际上是clang,所以命令和linux下有出入。
在mac下man gcc会提示找不到gcc,因为实际这个gcc是clang
(3)./main srcFile 把源文件传递给语法分析生成器

bison使用命令:
(1)flex lexical.l 语法分析依赖于词法分析的输出,因此首先要得到词法分析器。
(2)bison -d syntax.y 生成语法分析文件,-d参数是令其生成对应的.c文件和.h文件。
注:在bison源文件syntax.y中要在引用词法分析器文件,#include “lex.yy.c”
(3)为了能够使用在bison文件中定义的语法符号,在flex生成的词法分析器文件中也需要引用bison生成的文件,#include “syntax.tab.h”
(4)完成依赖关系的配置,编译链接词法分析器文件和语法分析文件,输入gcc -ll syntax.tab.c lex.yy.c -o scanner得到语法分析器。
(5)./scanner 根据代码输入相应的内容。

正则表达式复习:
(1)”.”表示通配符,匹配除了“\n”以外的任何一个字符
(2)”[]”表示字符集,即括号内一个字符匹配到则就算匹配到这个字符集。缩写表示法[0-9a-zA-Z]。”^”用在方括号内表示补集。
(3)”^”用在方括号外会匹配一行的开头。符号”$”用于匹配一行的结尾。“<>”匹配文件的结尾。
(4)符号”{}”多重含义。A{5}表示AAAAA。A{1,3}表示A、AA或者AAA,即1到3个A。此外,定义的名字要在花括号内,如{letter}。
(5)”*“表示闭包操作,匹配零个或多个表达式,如X*表示零个或多个X。
(6)“+”表示正闭包操作,匹配一个或多个表达式,用法同上。
(7)“?”表示零个或者一个表达式,即有或者无。
注:”?”、”*”、”+”都仅仅只对左边临近的那个表达式起效。如abc?表示ab和零个或者多个c
(8)”|”表示选择操作,如a|b|c表示a或者b或者c。
(9)”\”表示转义字符,与和C语言类似。
(10)“””表示忽略转义,如“\n”代表字符串”\n”而不是换行符
(11)”/“表示查看输入字符的上下文,如0/1匹配01串中的0而不匹配02中的0。
(12)其余剩下的所有字符都表示其本身。

正则优先级
正则在线测试工具