1. 实验目的与内容
    对SysY语言进行词法分析,可以查出语言中可能包含的词法错误。
    从控制台输入字符串,如有出错则输出错误,没有错误则按照二元组的方式输出
  2. 设计方法
    对SysY语法进行分析如下:
    (1) 保留字: if else for while do continue return break int const main void
      注意:所有关键词都是小写的。
    (2) 标识符ID,与标准C语言一致,即:以下划线或字母开头的字母数字下划线组成的符号串。
    (3)运算符和分界符: +、-、*、/、% 、==、!=、<、>、<=、>= 、!、&&、|| 、(、)、{、}、[、]。
    (4) 空白符包括空格、制表符和换行符,用于分割标识符、保留字、运算符和分界符,词法分析阶段要忽略空白符。
    本程序使用Java编写
    程序启动输入后,字符串保留在instr中。先对字符串进行预处理,去除两个词之间多余的空格,再按空格进行切割。切割完成后逐个单词进行判断,分别判断是否属于保留字、数字、运算符和分界符等等,如果匹配成功则输出。每次判断时使用token逐个读取字符串的各个字符直到一个单词结束并且进行判断。
package cn.hdu;import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Word {//1.词法分析程序public static boolean IsLetter(char ch){if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z'))return true;return false;}//判断是否为数字public static boolean IsDigit(char ch){if (ch >= '0'&&ch <= '9')return true;return false;}//判断是否为分界符public static int IsSymbol(char ch){char symbol[]= { '(',')',',',';','<','>','{','}','[',']'};for (int i = 0; i < 8; i++){if (ch == symbol[i])return i;}return -1;}//判断是否为关键字public static int IsKeyword(String str){String keyword[] = {"if","else","for","while","do", "continue", "return", "break" ,"int", "const", "main", "void" };for (int i = 0; i < keyword.length; i++){if (str.equals(keyword[i]) ){return i;}}//不是关键字即为标识符return 30;}public static boolean IsRight(String str){char[] chars = str.toCharArray();// System.out.println(chars.length);int f = 0;//for (int i = 0; i < str.length()-1; i++)//{/* if (IsLetter(chars[i]) ||"_".equals( chars[i]))f=1;*/if (IsDigit(chars[0]))if (IsLetter(chars[1]) || chars[1] == '_')return false;//}/* if(f==0) return true;if(!(IsLetter(chars[0])||chars[0]=='_')) return false;for (int i = 0; i < str.length(); i++){if (!(IsDigit(chars[i])||IsLetter(chars[i]) ||"_".equals( chars[i])))return false;}*/return true;}//多余空格处理public static String HandleSpace(String str){int j = 0;char[] word=new char[255];boolean temp = false;char[] a = str.toCharArray();for (int i = 0; i < a.length; i++){if (a[i] != ' ' && a[i] != '\t'){word[j++] = a[i];temp = false;}else{if (!temp&&a[i] != '\t'){word[j++] = a[i];temp = true;}}}char[] ans = new char[j];for (int i = 0; i < j; i++) {ans[i]=word[i];}return String.valueOf(ans);}public static void main(String[] args) {String token= new String();//存放字符串String[] str;String instr;boolean flag=false;int k=0;Map<Integer,String> identifiers= new HashMap<>();Scanner sc = new Scanner(System.in);while(sc.hasNextLine()){instr = sc.nextLine();if(instr.equals("")) break;str = HandleSpace(instr).split(" ");//处理多余空格后按空格分隔for (int j = 0; j < str.length; j++) {//System.out.println(i+str[i]);char[] strtemp = str[j].toCharArray();//将分隔好的字符串装换为字符数组if (!IsRight(str[j])){System.out.println(str[j]+" 为非法输入");break;}for (int i = 0; i<strtemp.length&&strtemp[i]!=' '; i++) {//标识符,关键词if ((IsLetter((strtemp[i])) || (strtemp[i]) == '_') && !flag){while (i<strtemp.length&&(IsLetter(strtemp[i]) || IsDigit(strtemp[i]) || strtemp[i] == '_')){//System.out.println("strtemp:"+strtemp[i]);token += strtemp[i];i++;}i--;//System.out.println("token"+token);//System.out.println("istoken"+IsKeyword(token));if (IsKeyword(token) != 30){System.out.println("(<保留字>"+token+")");}else{if(identifiers.containsKey(token)){System.out.println("(<标识符>,"+token+")");}else{identifiers.put(k,token);System.out.println("(<标识符>,"+token+")");k++;}}token = "";}else if (IsDigit(strtemp[i]) && !flag){while (i<strtemp.length&&IsDigit(strtemp[i])){token +=strtemp[i];i++;}i--;System.out.println("(<数字> "+token+")");token = "";}//<,<=,<>else if (strtemp[i] == '<' && !flag){if (i+1<strtemp.length&&strtemp[i+1] == '='){System.out.println("(<运算符> <=)");}else if (i+1<strtemp.length&&strtemp[i+1] == '>'){System.out.println("(<运算符> <>)");}else{System.out.println("(<运算符> < )");}}//>,>=else if (strtemp[i] == '>' && !flag){if (i+1<strtemp.length&&strtemp[i+1] == '='){System.out.println("(<运算符> >=)");i++;}else{System.out.println("(<运算符> >)");}}//!,!=else  if (strtemp[i] == '!' && !flag){if (i+1<strtemp.length&&strtemp[i+1] == '='){System.out.println("(<运算符> !=)");i++;}else{System.out.println("(<运算符> !)");}}//+,++else if (strtemp[i] == '+' && !flag){if (i+1<strtemp.length&&strtemp[i+1] == '+'){System.out.println("(<运算符> ++)");i++;}else{System.out.println("(<运算符> +)");}}//-,--else if (strtemp[i] == '-' && !flag){if (i+1<strtemp.length&&strtemp[i+1] == '-'){System.out.println("(<运算符> --)");i++;}else{System.out.println("(<运算符> -)");}}else if (strtemp[i] == '*' && !flag){System.out.println("(<运算符> * )");}else if (strtemp[i] == '/' && !flag){System.out.println("(<运算符> / )");}//=,==else if (strtemp[i] == '=' && !flag){if (i+1<strtemp.length&&strtemp[i+1] == '='){System.out.println("(<运算符> ==)");i++;}else{System.out.println("(<运算符> =)");}}//余下定界符等else if (IsSymbol(strtemp[i]) != -1 && !flag){System.out.println("(<分界符> "+strtemp[i]+")");}else if(!flag){System.out.println(str[j]+"为非法标识符");break;}}}}}
}
  1. 程序测试
    1.输入:
    int main(){
    return 0;
    }
    输出:
    (<保留字>int)
    (<保留字>main)
    (<分界符> ()
    (<分界符> ))
    (<分界符> {)
    (<保留字>return)
    (<数字> 0)
    (<分界符>

    编译原理 SysY语言的词法分析程序相关推荐

    1. 编译原理(1)词法分析程序(C++实现)

      这是关于编译原理的第一篇文章. 本科阶段的教学与实际操作存在一些脱节的现象.比如词法编辑器你可以完全在不知道什么nfadfa啊之类东西情况下强行摸索出来,而书上和上课讲的却是各种状态转换之类的东西.还 ...

    2. 编译原理SNL语言编译器实验报告

      完成实验内容 实验要求: (1)设计并实现SNL程序设计语言的编译程序 (2)四个必做: 词法分析模块 语法分析模块(递归下降方法) 语法分析模块(LL(1)方法) 语义分析模块 (3)编程语言不限 ...

    3. 【编译原理】语言认知之Java、Python、C++快速排序三者运行效率与开发效率比较

      [编译原理]语言认知之Java.Python.C++快速排序&三者运行效率与开发效率比较 一.实验目的 二.实验环境 三.实验步骤 四.快速排序程序 五.实验结果 六.总结 一.实验目的 强化 ...

    4. 编译原理 C语言词法分析程序的设计与实现

      词法分析程序 目录 一. 实验题目 二. 实验要求 三. 程序设计说明 四. 源程序 五. 可执行程序 六. 测试报告: 1. 输入 2. 输出 3. 分析说明 一.实验题目 C语言词法分析程序的设计 ...

    5. 大前端开发者需要了解的基础编译原理和语言知识

      转自:https://yq.aliyun.com/articles/180879 在我刚刚进入大学,从零开始学习 C 语言的时候,我就不断的从学长的口中听到一个又一个语言,比如 C++.Java.Py ...

    6. 编译原理——SysY编译器实践报告

      Jason Compiler编译器概述 基本功能 实现将C语言自己SysY分别转换成两种中间表示Eeyore和Tigger,以及最终的Risc-V指令. 使用如下命令生成Eeyore中间表示: ./m ...

    7. 太原理工 编译原理 c语言,太原理工大学编译原理实验

      <太原理工大学编译原理实验>由会员分享,可在线阅读,更多相关<太原理工大学编译原理实验(19页珍藏版)>请在人人文库网上搜索. 1.本科实验报告课程名称: 编译原理 实验项目: ...

    8. micropython编译原理_C语言嵌入式Linux高级编程第9期:CPU和操作系统入门视频课程...

      嵌入式开发是一门交叉学科. 它要求我们的嵌入式工程师,不仅学习C语言.汇编.软件工程等软件层面的知识技能,还要求对CPU内部工作机制.计算机系统架构.操作系统原理.编译器等都有一个全局的认识和把握. ...

    9. 编译原理第三章 词法分析与有穷自动机

      词法分析与有穷自动机 1.词法分析程序的功能 2.正规集.正规式.正规文法.确定的有穷自动机.不确定的有穷自动机的定义. 3.正规文法.有穷自动机.正规式三者之间的互相转换方法.不确定有穷自动机到确定 ...

    最新文章

    1. Transformers资料汇总!从原理到应用
    2. NOIP2018 集训(一)
    3. python开发的软件sparrow-sparrow
    4. vuex保存用户信息_Vuex状态管理
    5. JavaWEB过滤器和监听器技术
    6. MS SQL SERVER 读取数据库中每个表的描述/注释以及表中字段/列的字段名,字段类型,字段描述/注释/说明等信息...
    7. Css中部分知识点整理【笔记整理】
    8. linux|计划任务
    9. 游戏目标的三个核心组成部分
    10. 第21章 分层架构软件测试
    11. 大平原顾问快讯FRX移至新服务器
    12. 关于Linux UDP/TCP reuseport 二三事
    13. 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换的方法
    14. 安徽大学计算机学院张静,安徽大学2011年国家励志奖学金获奖学生名单
    15. 微博长图快速排版生成工具
    16. mysql在dos界面修改密码
    17. 前端 115道 面试题总结【持续更新...】
    18. 使用FleaPHP框架构建简单留言本应用
    19. Cookie重名问题处理
    20. 运维企业实战——RHCS集群套件 实现高可用

    热门文章

    1. python:比较人脸识别中gallery数据集和prob数据的IP
    2. 清风数学建模---插值算法
    3. 计算机组老师颁奖词,获奖教师的颁奖词
    4. oracle查看锁定任务
    5. Autolayout第三方库Masonry的入门与实践
    6. tiny4412 裸机程序 八、重定位到DRAM及LCD实验【转】
    7. 青藤云Webshell查杀绕过
    8. python 中文分析句子成分_语文句子成分分析详解
    9. 高屋建瓴脚踏实地 洗心革面重新做人
    10. 【bitset乱搞】BZOJ3687 简单题