1. 蛋疼的编译原理之词法分析:
(1)理解词法分析在编译程序中的作用
(2)加深对有穷自动机模型的理解
(3)掌握词法分析程序的实现方法和技术
2. 要求
A上次实验分析出的四则运算表达式相关的词法
1) 操作数
如,23等数字
2) 运算符和界符
+ - * / ( )
3) 空格由空白、制表符和换行符组成。词法分析阶段通常被忽略。
B各种单词符号对应的种别编码举例
单词符号 |
种别码 |
单词符号 |
种别码 |
Digitdigits |
1 |
( |
6 |
+ |
2 |
) |
7 |
- |
3 |
... |
... |
* |
4 |
|
|
/ |
5 |
|
|
(3)词法分析程序的功能
输入:一般的四则运算式
输出:二元组(syn, token或sum)构成的序列。
syn为单词种别码;
token为存放的单词自身字符串;
sum为整形常数。
例如:对表达式34*45+12经词法分析后输出如下序列:(1,34)(4,) (1,45) (2,) (1,2 ).......
我们要做的就是把那些数字和操作符转化为上面的对应的种别码:
上代码:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; public class TmsTest { public static void main(String[] args) throws IOException { // 从外面得到输入的字符串 String s = TmsTest.getString(); System.out.println("输入的式子为:" + s); // 定义一个队列放置每个字符转义后的字符串 Queue<String> queue1 = new LinkedList<String>(); // 定义每个对应的符号对应的转义后的字符,开始都为空,分别为"数字,+,-,*,/,(,)" String numS = ""; String AllS = ""; String add = ""; String sub = ""; String mul = ""; String div = ""; String lb = ""; String rb = ""; for (int i = 0; i < s.length(); i++) { // 循环得到每一个字符 char c = s.charAt(i); switch (c) { //当为数字类型的时候做出的操作 case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': numS += c; //将数字进行累加 break; case '+': if (numS == "") { //进行判断,当表示数字的串为空的时候(相当于‘+’号前面为括号,没有数字)只将‘+’号对应的码添加到队列里面 add = "(2, )"; queue1.add(add); add = ""; break; } else { //当加号前面有数字的时候先将数字加到队列里面,再把‘+’号对应的码加到队列里面。 AllS = "(1," + numS + ")"; queue1.add(AllS); numS = ""; AllS = ""; add = "(2, )"; queue1.add(add); add = ""; break; } case '-': if (numS == "") { sub = "(3, )"; queue1.add(sub); sub = ""; break; } else { AllS = "(1," + numS + ")"; queue1.add(AllS); numS = ""; AllS = ""; sub = "(3, )"; queue1.add(sub); sub = ""; break; } case '*': if (numS == "") { mul = "(4, )"; queue1.add(mul); mul = ""; break; } else { AllS = "(1," + numS + ")"; queue1.add(AllS); numS = ""; AllS = ""; mul = "(4, )"; queue1.add(mul); mul = ""; break; } case '/': if (numS == "") { div = "(5, )"; queue1.add(div); div = ""; break; } else { AllS = "(1," + numS + ")"; queue1.add(AllS); numS = ""; AllS = ""; div = "(5, )"; queue1.add(div); div = ""; break; } case '(': lb = "(6, )"; queue1.add(lb); lb = ""; break; case ')': if (i == s.length() - 1) { AllS = "(1," + numS + ")"; queue1.add(AllS); numS = ""; AllS = ""; rb = "(7, )"; queue1.add(rb); rb = ""; break; } else { AllS = "(1," + numS + ")"; queue1.add(AllS); numS = ""; AllS = ""; rb = "(7, )"; queue1.add(rb); rb = ""; break; } //引入一个$运算符表示结束 case '$': if (numS == "") { break; } else { AllS = "(1," + numS + ")"; queue1.add(AllS); break; } default: break; } } while (queue1.isEmpty() == false) { System.out.print(queue1.peek()); queue1.poll(); } } /* * 定义一个得到输入字符串的方法。 */ public static String getString() throws IOException { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("请输入表达式:"); String s = br.readLine(); return s; } }
输出结果:
请输入表达式:1*2+(1-2)+3/3+2$ 输入的式子为:1*2+(1-2)+3/3+2$ (1,1)(4, )(1,2)(2, )(6, )(1,1)(3, )(1,2)(7, )(2, )(1,3)(5, )(1,3)(2, )(1,2)
感觉最难的课就是编译原理,太抽象了,像我们这样的脑子完全跟不上。有没有大神指导一下怎么来学习他。
相关推荐
本文将深入探讨词法分析器的概念、功能以及如何实现,结合提供的"编译原理之词法分析器"实验资料,我们将探讨这一重要主题。 词法分析器,又称为扫描器或 tokenizer,是编译器或解释器的第一个阶段。它的主要任务是...
编译原理之词法分析图露露 编译原理是计算机科学的一个核心领域,它研究的是如何将高级语言转换为低级语言,使得计算机能够执行。词法分析是编译原理的重要组成部分,它负责将源代码转换为 Token 序列,以便于后续...
这篇实验报告“编译原理之词法分析实验报告”可能是学生张秀秀在学习编译原理课程时完成的一项实践作业,通过自己编写程序来实现词法分析的过程。 词法分析通常由词法分析器(也称为扫描器或词法生成器)执行,它的...
### 编译原理之词法分析 #### 一、词法分析的重要性和应用场景 随着计算机技术的迅猛发展,计算机语言的结构变得日益复杂。在这样的背景下,为了开发更高效的编译器,研究者们逐渐意识到将词法分析独立出来进行...
本资源聚焦于“基于Java的编译原理之词法分析器”,这是一门涉及计算机科学、软件工程和计算机语言学的综合学科。词法分析器,也被称为扫描器或词法分析程序,是编译器或解释器的第一步,它负责将源代码分解成一系列...
在编译原理中,词法分析程序通常由一个称为“词法分析器”或“扫描器”的程序实现。 词法分析器的工作原理大致可以分为以下几个步骤: 1. **识别字符集**:首先,词法分析器需要定义一个字符集,这个字符集包括了...
### 编译原理之词法分析器:深入解析与实现 在计算机科学中,编译原理是理解如何将高级语言转换成机器可执行代码的核心领域。词法分析器(也称为扫描器)作为编译器的第一阶段,负责将源代码分割成一系列的有意义的...
在这个“编译原理之词法分析器的实现”压缩包中,我们可能会找到一个针对C语言子集的词法分析程序,它的目的是帮助我们深入理解词法分析的基本概念和实现过程。 词法分析的主要任务是识别源代码中的关键字、标识符...
a)启动程序,请求输入测试程序名,键入程序名后自动开始词法分析并输出结果;b)输出结果为单词的二元式序列(样式见样板输出1和2);c)要求能发现下列词法错误和指出错误性质和位置:非法字符,即不是SAMPLE字符集的...
词法分析是编译原理中的一个关键步骤,它在程序设计语言的编译过程中起着承上启下的作用。在编程的世界里,源代码是由一系列符合特定语法的字符序列组成的,这些字符序列需要被解析为计算机能理解的形式。词法分析...
在编程领域,编译原理是理解计算机如何将高级语言转换为机器可执行代码的重要理论基础。词法分析是编译器设计中的第一步,它将源代码分解成一系列有意义的符号,也就是我们所说的“token”。本实验是基于Java语言...
编译原理实验词法分析器 本实验的目的是设计和实现一个词法分析器,以加深对词法分析过程的理解,并掌握词法分析方法。实验中,我们将使用 C 语言实现一个简单的词法分析器,能够识别和分析 C 语言源程序中的单词...
编译原理词法分析器源程序C语言实现 本资源是一个使用C语言实现的编译原理词法分析器源程序,主要功能是对输入的源程序进行词法分析,识别出关键字、标识符、数字等 token,并将其输出。 1. 编译原理 编译原理是...
词法分析是编译原理中的一个关键步骤,它是编译器前端的重要组成部分,负责将源代码文本转换成一系列有意义的符号单元,也称为记号或Token。这些记号是源程序的基本构建块,它们通常包括关键字、标识符、常量、...
除实现的基本的属性字输出外,还附加了如下功能: 1.无符号整型常量合法性的检测 2.标识符作用域的识别 3.未定义标识符的检错 4.括号是否配对的检测 5.支持带小数点的浮点常量 附测试文件及实现要求!
编译原理是计算机科学中的一个重要领域,主要研究如何将高级编程语言转换为机器可以理解的低级语言,如机器码或汇编语言。这个过程通常包括三个主要阶段:词法分析、语法分析和语义分析。 词法分析,也称为扫描,是...
编译原理是研究编译器设计的一门学科,其中词法分析是编译器的第一个阶段,也是构建理解程序的关键步骤。词法分析器(也称为扫描器或词法分析器)的主要任务是从源代码中识别出一个个有意义的符号,即“Token”,为...
编译原理是计算机科学中的一个重要领域,主要研究如何将高级编程语言转换为机器可以理解的低级语言,如汇编代码或机器代码。这个过程分为多个阶段,其中一个关键步骤是词法分析,也称为扫描器或者词法分析器的设计与...