词法分析_参考报告

该实验报告详细介绍了C语言子集的词法分析,包括关键字、分隔符、运算符和其他标记的定义,以及词法分析程序的功能和主要算法思想。通过实例展示了词法分析后的单词序列和变量表,旨在加深对词法分析原理的理解。
摘要由CSDN通过智能技术生成

词法分析实验报告

 

1.1 实验目的

设计、编制并测试一个词法分析程序,加深对词法分析原理的理解。

 

1.2 实验要求

1.2.1 待分析的C语言子集的词法

1. 关键字

"auto", "break", "case", "char", "const", "continue",

  "default", "do", "double", "else", "enum", "extern",

  "float", "for", "goto", "if", "int", "long",

  "register", "return", "short", "signed", "sizeof", "static",

  "struct", "switch", "typedef", "union", "unsigned", "void",

  "volatile", "while"

所有的关键字都是小写。

2.分隔符

"[", "]", "{", "}", ";", """, "'", "#", "(", ")",  ".", ":", " ", ",",

    "\\", "\?"

3. 运算符

"+", "-", "*", "/", "<", ">", "=", "^", "&", "|", "%", "~","!", ">>", "<<", "++", "--", "&&", "||", "!=", "==", "+=", "-=", "<=", ">=", "->"

3.其他标记ID和NUM

通过以下正规式定义其它标记:

VAR→letter(letter|digit)*

NUM→digit digit*

letter→a|…|z|A|…|Z

digit→0|…|9…

4.忽略的部分

空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。空格由空白、制表符和换行符组成

由’//’开始的行注释,和’/*’开始’*/’结束的段注释,对程序没有影响,也忽略.

1.2.2 单词类别序号和表序号

输出单词结点有类别,序号等信息

类别:由宏定义定义的int型数据

#define KEY         0

#define SPARATOR    1

#define OPERATOR    2

#define VALUE       3

#define VARIABLE    4

序号:单词在对应的表中的序号,从0开始

关键字表:

"auto"      0   "break"     1   "case"      2   "char"      3  

"const"     4   "continue"  5   "default"   6   "do"        7

"double"    8   "else"      9   "enum"      10  "extern"    11

  "float"     12  "for"       13  "goto"      14  "if"        15

"int"       16  "long"      17  "register"  18  "return"    19

"short"     20  "signed"    21  "sizeof"    22  "static"    23

"struct"    24  "switch"    25  "typedef"   26  "union"     27

"unsigned"  28  "void"      29  "volatile"  30  "while"     31

分隔符表:

"[" 0  "]" 1  "{" 2  "}" 3  ";" 4  """ 5  "'" 6  "#" 7 

"(" 8  ")" 9  "." 10 ":" 11 "," 12 "\\" 13 "\?" 14

运算符表:

"+"     0   "-"     1   "*"     2   "/"     3   "<"     4   ">"     5

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【问题描述】 请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下: (1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格式统一定义; (2)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt(注意不要写错文件名);输出的结果文件统一命名为output.txt(注意不要写错文件名),结果文件中每行按如下方式组织: 单词类别码 单词的字符/字符串形式(中间仅用一个空格间隔) 单词的类别码请统一按如下形式定义: 单词名称 类别码 单词名称 类别码 单词名称 类别码 单词名称 类别码 标识符 IDENFR else ELSETK - MINU = ASSIGN 整形常量 INTCON switch SWITCHTK * MULT ; SEMICN 字符常量 CHARCON case CASETK / DIV , COMMA 字符串 STRCON default DEFAULTTK < LSS ( LPARENT const CONSTTK while WHILETK GRE [ LBRACK char CHARTK scanf SCANFTK >= GEQ ] RBRACK void VOIDTK printf PRINTFTK == EQL { LBRACE main MAINTK return RETURNTK != NEQ } RBRACE if IFTK + PLUS : COLON 【输入形式】testfile.txt中的符合文法要求的测试程序。 【输出形式】要求将词法分析结果输出至output.txt中。 【特别提醒】(1)读取的字符串要原样保留着便于输出,特别是数字,这里输出的并不是真正的单词值,其实是读入的字符串,单词值需另行记录。 (2)本次作业只考核对正确程序的处理,但需要为今后可能出现的错误情况预留接口。 (3)在今后的错误处理作业中,需要输出错误的行号,在词法分析的时候注意记录该信息。 (4)单词的类别和单词值以及其他关注的信息,在词法分析阶段获取后,后续的分析阶段会使用,请注意记录;当前要求的输出只是为了便于评测,完成编译器中无需出现这些信息,请设计为方便打开/关闭这些输出的方案。 【文法定义】请到“2020年文法定义(用于查看文法,不计入成绩)”作业中查看文法 【样例输入】 coNst int cONst1 = 001, const2 = -100; const char const3 = '_'; int change1; char change3; int gets1(int var1,int var2){ change1 = var1 + var2; return (change1); } void main(){ printf("Hello World"); printf(gets1(10, 20)); } 【样例输出】 CONSTTK coNst INTTK int IDENFR cONst1 ASSIGN = INTCON 001 COMMA , IDENFR const2 ASSIGN = MINU - INTCON 100 SEMICN ; CONSTTK const CHARTK char IDENFR const3 ASSIGN = CHARCON _ SEMICN ; INTTK int IDENFR change1 SEMICN ; CHARTK char IDENFR change3 SEMICN ; INTTK int IDENFR gets1 LPARENT ( INTTK int IDENFR var1 COMMA , INTTK int IDENFR var2 RPARENT ) LBRACE { IDENFR change1 ASSIGN = IDENFR var1 PLUS + IDENFR var2 SEMICN ; RETURNTK return LPARENT ( IDENFR change1 RPARENT ) SEMICN ; RBRACE } VOIDTK void MAINTK main LPARENT ( RPARENT ) LBRACE { PRINTFTK printf LPARENT ( STRCON Hello World RPARENT ) SEMICN ; PRINT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值