编译原理-专题1 词法分析程序设计

本文档介绍了编译原理实验专题1——词法分析程序设计,目标是理解和实现CP语言的词法分析。内容包括实验目的、实验思路和运行结果。CP语言的关键字、标识符、整数、运算符和分界符等要素被详细阐述,并指出词法分析阶段应忽略空白符。实验思路中提到了预处理和词法分析函数的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验专题1、词法分析程序设计

s

1. 实验目的

  • 设计、编制并调试一个简单语言CP(Compiler Principle)的词法分析程序,加深对词法分析原理的理解。
  • CP语言的词法
    (1) 关键词: begin end if then else for while do and or not
    注意:所有关键词都是小写的。
    (2) 标识符ID,与标准C语言一致,即:以下划线或字母开头的字母数字下划线组成的符号串。
    (3)无符号整数NUM:数字串
    (4)运算符和分界符: +、-、*、/、>、<、=、:=、>=、<=、<>、++、–、(、)、; 、 #
    注意::=表示赋值运算符、#表示注释开始的部分,;表示语句结束,<>表示不等关系
    (5) 空白符包括空格、制表符和换行符,用于分割ID、NUM、运算符、分界符和关键词,词法分析阶段要忽略空白符。
  • CP语言是大小写敏感语言;
    字母为a-zA-Z,数字为0-9;
    每行代码中从#开始的部分为注释部分(参考python语法)
    **

2. 实验思路

预处理函数,对我们输入的程序进行去注释、多余空格等规范化操作。去掉注释部分通过正则表达式将#后字符替换成 ’ ’ 。

# 去掉注释,获取文件
def filterResource(new_file,file):
    f2 = open(new_file,'w+')
    txt  =  ''.join(open(file,'r').readlines())
    data_txt = re.sub(r'\#.*', '', txt)
    for line in data_txt.split('\n'):
        line = line.strip()
        line = line.replace('\\t','')
        line = line.<
### 词法分析程序设计原理与实现 #### 设计原则 词法分析器的主要任务是从源代码中提取出有意义的符号单元,即标记(token)。这些标记通常由单词、运算符、分隔符等组成。为了完成这一过程,词法分析器需要遵循一定的规则来识别不同的语法成分,能够处理可能出现的各种异常情况[^1]。 #### 类别编码定义 对于每一个被识别出来的单词符号,都会赋予一个特定类型的编号或名称,这有助于后续阶段更方便地理解和操作这些数据项。例如,在C语言环境中可以有如下分类: - 关键字 (Keyword): `if`, `else`, `while` 等; - 标识符 (Identifier): 用户自定义的名字; - 常量 (Constant): 数值常数、字符常数等; - 运算符 (Operator): 加减乘除以及逻辑运算符如 &&, ||, ! 等; - 分界符 (Delimiter): 圆括号(), 方括号[], 花括号{}, 半角逗号,, 和句号. 等。 针对引用材料提到的操作符扩展列表,还需加入以下几类特殊运算符及其对应的类别编码[^2]: ```cpp // 特殊运算符表 enum SpecialOperators { INC_OP = 0x80, // ++ DEC_OP, // -- RSHIFT_ASSIGN, // >>= LSHIFT_ASSIGN, // <<= ADD_ASSIGN, // += SUBTRACT_ASSIGN, // -= MULTIPLY_ASSIGN, // *= DIVIDE_ASSIGN, // /= AND_OP, // && OR_OP, // || NOT_OP // ! }; ``` #### 错误检测机制 当遇到不符合预期模式的数据时,比如非法字符或者不完整的语句结构,则应当触发相应的警告信息提示开发者注意这些问题的存在。有效的错误报告不仅限于指出哪里出了错,还应该提供足够的上下文帮助理解问题所在的位置和性质。 #### 输出形式 经过扫描后的结果将以一系列二元组的形式保存在一个临时文件里,每个二元组包含了两部分的信息——一个是上述提及到的类别码,另一个则是实际读取得到的具体字符串表示。这种做法使得整个编译流程更加模块化易于管理维护的同时也为接下来更高层次上的解析工作打下了坚实的基础。 #### 测试案例构建 创建至少两个不同场景下的输入样本来验证系统的健壮性和准确性是非常必要的。理想情况下,这两个样本要覆盖尽可能多的实际应用场景以便充分暴露潜在缺陷及时修正它们。下面是一个简单的例子说明如何准备这样的测试用例: **Test Case 1:** 正确无误的标准C程序片段。 ```c int main() { int a; float b=3.14f; } ``` 期望输出: | Token Type | Lexeme | | --- | --- | | Keyword | int | | Identifier | main | | Delimiter | (){}; | **Test Case 2:** 含有一些常见拼写失误或其他明显违反语法规则的情况。 ```c in mian(){ inta ; floa t b==3..14ff;; } ``` 期望输出(带报错): | Line No. | Error Message | | --- | --- | | 1 | Unrecognized keyword 'in' at line 1 column 1 | | ... | More error messages as needed... |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值