词法分析器

PL/0 词法分析

…衆ロ難τιáo~ 提交于 2020-03-29 20:25:04
  用 C 语言编写一个 PL/0 词法分析器 ,为语法语义分析提供单词, 使之能 把输入的字符 串 形式的源程序分割成一个个单词符号传递给语法语义分析, 并把分析结果 (基本字,运算符, 标识符 ,常数以及界符) 输出 。   PL/0 的词法分析程序 GETSYM 是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析。 其主要任务为: 1、滤空格;2、识别基本字;3、识别标识符;4、拼数;5、拼复合词;6、输出源程序。 PL/0 编译程序一般设置 3 个全程变量: SYM :存放每个单词的类别,用内部编码形式表示; ID : 存放用户所定义的标识别符的值; NUM :存放用户定义的数。 PL/0 语言的单词的种类分成基本字(亦称保留字)、运算符、标识符、常数、界符 5 个大类,以下是针对这 5 类单词的一种 EBNF 描叙:   < 无符号整数 > :: =< 数字 >{< 数字 >}   < 标识符 > :: =< 字母 >{< 字母 >|< 数字 >}   < 字母 > :: =a|b| …… |X|Y|Z   < 数字 > :: =0|1|2| …… |8|9   < 保留字 > :: = const | var | procedure | begin | end | odd | if | then |

js闭包

余生颓废 提交于 2020-03-08 01:09:26
​ 今天呢咱们来聊聊这个js闭包,我们基本上在面试中,必然会问到的问题:什么是闭包?说说你对闭包的理解.闭包的作用是什么? ​ 闭包也是一个很不好理解的概念,往往我们遇到的机会很多很多,很多朋友呢都说了对闭包的理解,问题表达的方式不一样,但是呢,最后都对闭包没有很清晰的理解.所以呢我这边就帮助大家理解什么是闭包.其实说起来,可以深,也可以浅.先由浅着说.之前呢,在网上也是找了不少的资料,看见人家理解的闭包,我提取出了说法有问题 的4点: ​ 1.闭包是指有权访问另一个函数作用域中变量(参数)的函数(不可取) ​ 2.闭包就是能读取其他函数内部变量的函数(不可取) ​ 3.闭包可以理解成定义一个函数内部的函数(不可取) ​ 4.函数就是闭包(不可取) ​ 这4点呢,其实呢,怎么说呢,不能否认它是错的,只能说不严谨,第一点,可以得到一个结论,闭包是一个函数,第二点也差不多的意思,第三点有意思了,定义一个函数内部的函数,的确有这个特征,而第四点,其实也是对的,因为MDN上的解释是:闭包是一个特殊的函数对象.那上面的几种说法都是不严谨的,其实最终我查询资料,都归纳了一句话: ​ 当一个函数能够记住并访问到其所在的词法作用域及作用域链,特别强调是在其定义的作用域外进行的访问,此时该函数和其上层执行上下文共同构成闭包 ​ 怎么理解这句话呢,其中包含两个新的名词,词法作用域及作用域链

编译原理-

泄露秘密 提交于 2020-03-07 14:35:12
编译器编译过程 词法分析->语法分析 graph TD 词法分析 --&gt; 语法分析--&gt;语义分析--&gt;中间代码生成--&gt;优化--&gt;代码生成 来源: oschina 链接: https://my.oschina.net/u/2555967/blog/3189522

词法分析器--DFA(c++实现)

房东的猫 提交于 2020-02-18 09:10:21
语言名为TINY 实例程序: begin var x,y:interger; x:=10; read(x); if y<0 then x:=x-y; x:=x+y; write(x); end TINY语言扫描程序的DFA: 代码 //ExplLexicalAnalyzer.h #ifndef EXPLLEXICALANALYZER_H #define EXPLLEXICALANALYZER_H #define MAXTOKENLEN 40 #define MAXRESERVED 13 typedef enum { ENDFILE, ERROR, IF, THEN, ELSE, END, REPEAT, UNTIL, READ, WRITE, VAR, BEGIN, INTEGER, DOUBLE, STRING, ID, NUM, ASSIGN, EQ, LT, PLUS, MINUS, TIMES, OVER, LPAREN, RPAREN, SEMI, COMMA, DEFINE } TokenType; //typedef struct { // TokenType kind; // int row = -1; // int column = -1; // double value; // std::string ID; //} Token; TokenType

编译原理 (二)词法分析、语法分析、语义分析以及中间代码生成器的基本概念

[亡魂溺海] 提交于 2020-02-17 14:37:26
1.词法分析 词法分析的过程中,源代码程序被输入到了一个叫做扫描器的东西中,扫描器的任务就是进行词法分析。他应用了一种叫做 有限状态机 的算法把源代码分割成一个一个的记号,举例比如 array[index] = (index + 4) * (2 + 3) 这行代码,经过扫描就会变成如下的一个个记号: 记号 类型 array 标识符 [ 左方括号 index 标识符 ] 右方括号 = 赋值 ( 左圆括号 index 标识符 + 加号 4 数字 ) 左圆括号 * 乘号 ( 左圆括号 2 数字 + 加号 3 数字 ) 右圆括号 以上的这些记号一般有以下几类: 关键字 、 标识符 、 字面量 (数字、字符串等)和 特殊符号 。 单词类型 种别 种别码 关键字 if、else、for…… 一词一码 标识符 变量名、数组名…… 多词一码 常量 整型、浮点型、字符…… 一型一码 运算符 算术(+ - * / %)、关系(> < =)、逻辑(& | ~) 一词一码 界限符 ; ( ) [ ] { } 一词一码 在识别这些标志的同时,扫描器也同时把标识符存放到了符号表,将数字、字符串常量存放到文字表,以备后续步骤使用。对于C语言的预处理,他的宏替换和文件包含等工作不交给编译器范围而是交给独立的预处理器处理。 2.语法分析 语法分析则由 分析器 去扫描扫描器产生的那些记号去进行语法分析,产生语法树

c++词法分析器

怎甘沉沦 提交于 2020-02-14 23:20:59
词法分析器就是通过扫描一段程序判断是否是关键字、标识符、常数、分界符、运算符。一般分为一符一种和经典五中; 这里我用的是经典五中,此词法分析器是用c++编写的; /* 保留字|关键字:1 操作符|运算符:2 分界符:3 标识符:4 常数:5 无识别:6 */ 主要代码为: #include<iostream> using namespace std; #define MAX 10 /* 保留字|关键字:1 操作符|运算符:2 分界符:3 标识符:4 常数:5 无识别:6 */ char ch = ' '; char* keyWord[10] = {"void","main","break","include","begin","end","if","else","while","switch"}; char token[20];//定义获取的字符 //判断是否是关键字 bool isKey(char * token) { for(int i = 0;i < MAX;i++) { if(strcmp(token,keyWord[i]) == 0) return true; } return false; } //判断是否是字母 bool isLetter(char letter) { if((letter >= 'a' && letter <= 'z')||(letter >= 'A

词法分析器

女生的网名这么多〃 提交于 2020-02-13 05:30:07
1. 词法分析器 函数 skip_one_line: 跳过一行, 会在skip_comment中注释为//的时候调用 skip_comment: // 和 /**/ skip_blanks: 跳过空白行, 会在skip_comment处理完注释之后调用, 同时在get_next_token这个核心的词法分析器的接口函数中调用防止获取到的token含有空白字符 to_next_char: 将parser中的next_char_ptr指向的字符赋给cur_char, 并++next_char_ptr to_next_char_if: 和to_next_char类似, 返回类型为bool类型, 当nextchar是我们期望的值的时候调用to_next_char并返回true, 否则直接返回false peek_next_char: *parser->next_char_ptr peek_cur_char: parser->cur_char get_next_token: 给语法分析器调用的函数, 在get_next_token函数中主要由一个伪while循环(之所以是伪while循环, 是因为在while的结尾有return语句), 里面还有continue语句, 主要在遇到了注释, 调用了skip_comment之后continue继续获取Token, 因为注释并不是我们的token,

作业五 --词法编译器

二次信任 提交于 2020-02-05 05:53:53
词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:文件读取 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 单词符号 种别码 char 12 : 17 { 42 int 13 /\ 37 } 43 if 14 < 30 [ 44 else 15 <= 28 ] 43 return 16 <> 29 " 47 END 3 > 32 , 48 l(l|d)* 25 >= 31 ' 49 dd* 26 = 27 & 50 + 33 ; 39 && 51 - 34 ( 40 \\ 52 * 35 ) 41 / 36 : 38 源代码如下: #include<stdio.h> #include<conio.h> #include<math.h> #include<string.h> #include<stdlib.h> int i, row = 0, line = 0; char test[1000];

作业五 词法编译器

◇◆丶佛笑我妖孽 提交于 2020-02-05 03:12:27
词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:文件读取 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 单词符号 种别码 char 12 : 17 { 42 int 13 /\ 37 } 43 if 14 < 30 [ 44 else 15 <= 28 ] 43 return 16 <> 29 " 47 END 3 > 32 , 48 l(l|d)* 25 >= 31 ' 49 dd* 26 = 27 & 50 + 33 ; 39 && 51 - 34 ( 40 \\ 52 * 35 ) 41 / 36 : 38 源代码如下: #include<stdio.h> #include<conio.h> #include<math.h> #include<string.h> #include<stdlib.h> int i, row = 0, line = 0; char test[1000];

词法分析-实验报告

感情迁移 提交于 2020-02-04 02:38:33
实验一 词法分析实验 一、 实验目的   编制一个词法分析程序 二、 实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三、 实验方法、步骤及结果测试    1. 源程序名:压缩包文件( rar 或 zip )中源程序名 Lexer.c 可执行程序名: Lexer.exe    2. 原理分析及流程图   程序主要是通过字符型二维数组将各种单词符号以字符串的形式储存到数组中,然后再通过对用户输入的字符串将里面的字符逐个判断。   程序中涉及对字符判断的函数主要有三个,分别是Number、Alphabet和Sign。Number主要是将获取到的字符进行判断是否为数字,如果是数字则进行输出操作。Alphabet主要是判断标识符以及关键字的,将用户输入的字符串的字母复制到另一个字符串,然后与单词表的单词比对如果是输出为关键字,否则输出为标识符。Sign的主要功能是分析一些运算符以及界符等。 Number 函数流程图   Alphabet和Sign函数的实现过程与上述函数大致相同。    3. 主要程序段及其解释: void Number()/*识别字符串的数字*/ { int i=temp; if(string[i]>='0'&&string[i]<='9')/*判断是否为数字*/ { while(string[i+1]>='0'&&string