简单词法编译器

1.词法分析程序的功能:

词法分析器所输出单词符号常常表示成如下的二元式:

(单词种别,单词符号的属性值)

单词种别通常用整数编码。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种。运算符可采用一符一种的方法。界符一般用一符一种的方法。对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。单词符号的属性是指单词符号的特性或特征。

2.符号和种别码的对照表:

3.用文法描述词法规则:

程序设计语言中的几类单词可用下述规则描述:

1.增长的趋势:a^2n,aa aaaa aaaaaa........

b^2n,bb bbbb bbbbbb.......

2.循环规律:A->aa  A->Aaa

B->bb B->Bbb

3.S->A|B

A->aa|Aaa // 意思是aa为开头,循环不断增加aa

B->bb|Bbb // 意思是bb为开头,循环不断增加bb

4.已完成的代码:

#include<stdio.h>
#include<string.h>
char one[9][10]={"begin","if","then","while","do","end","main","int","char"};
int number;

int fenxi(char a[],int p)
{
    char b[10];
    int i=0,j=1,q;
    do{
        b[0]=a[i];
        if((b[0]>=‘a‘&&b[0]<=‘z‘)||(b[0]>=‘A‘&&b[0]<=‘Z‘))
        {
            for(j=1;j<10;j++)
            {
                b[j]=a[j];
                if(b[j]==‘ ‘)
                {
                    b[j]=‘\0‘;
                    p=j;
                    break;
                }
            }
            b[j+1]=‘\0‘;
            puts(a);
            puts(b);
            for(j=0;j<9;j++)
                if(strcmp(b,one[j])==0)
                {
                    printf("(%d,%s)",j+1,b);
                    q=0;
                    return p;
                }
                else
                    q=1;
            if(q==1)
            {
                printf("(10,%s)",b);
            }
            return p;
        }
        if((b[0]>=0)&&(b[0]<=9))
        {
            for(j=1;j<10;j++)
            {
                b[j]=a[j];
                if(b[j]==‘ ‘)
                {
                    b[j]=‘\0‘;
                    p=j;
                    break;
                }
            }
            printf("(11,%s)",b);
            return p;
        }
        if((b[0]==‘+‘)||(b[0]==‘-‘)||(b[0]==‘*‘)||(b[0]==‘/‘)||(b[0]==‘=‘)||(b[0]==‘(‘)||(b[0]==‘)‘)||(b[0]==‘#‘))
        {
            if(a[1]!=‘ ‘)
                p=1;
            else
                p=2;
            switch(b[0])
            {
            case ‘+‘:j=13;break;
            case ‘-‘:j=14;break;
            case ‘*‘:j=15;break;
            case ‘/‘:j=16;break;
            case ‘=‘:j=25;break;
            case ‘;‘:j=26;break;
            case ‘(‘:j=27;break;
            case ‘)‘:j=28;break;
            case ‘#‘:j=0;break;
            }
            printf("(%d,%s)",j,b);
            return p;
        }
        if((b[0]==‘:‘)||(b[0]==‘>‘)||(b[0]==‘<‘))
        {
            puts(a);
            if((a[1]!=‘=‘)&&(a[1]!=‘>‘)&&a[1]!=‘<‘)
            {
                switch(b[0])
                {
                case ‘:‘:j=17;break;
                case ‘<‘:j=20;break;
                case ‘>‘:j=23;break;
                }
                printf("(%d,%s)",j,b);
                return p;
            }
            else
            {
                b[1]=a[1];
                b[2]=‘\0‘;
                p=2;
                if((b[0]==‘:‘)&&(b[1]==‘=‘))j=18;
                else if((b[0]==‘<‘)&&(b[1]==‘=‘))j=21;
                else if((b[0]==‘>‘)&&(b[1]==‘=‘))j=24;
                else if((b[0]==‘<‘)&&(b[1]==‘>‘))j=22;
                printf("(%d,%s)",j,b);
                return p;
            }
        }

    }while(0);
}
void maopao(char a[],int p)
{
    int i;
    for(i=0;a[p+i]!=‘\0‘;i++)
        a[i]=a[p+i+1];
}

main()
{
    char a[100];
    int p;
    printf("ÇëÊäÈëÒ»¶Î³ÌÐò£º");
    gets(a);
    do{
        p=fenxi(a,p);
        maopao(a,p);
    }while(a[0]!=‘\o‘);

    printf("%d",p);
}
时间: 2024-10-25 00:47:11

简单词法编译器的相关文章

算法Sedgewick第四版-第1章基础-007一用两个栈实现简单的编译器

1. 1 package algorithms.util; 2 3 import algorithms.ADT.Stack; 4 5 /****************************************************************************** 6 * Compilation: javac Evaluate.java 7 * Execution: java Evaluate 8 * Dependencies: Stack.java 9 * 10 *

词法编译器

#include<stdio.h>                  /*定义I/O库所用的某些宏和变量*/#include<string.h>               /*定义字符串库函数*/#include<conio.h>                  /*提供有关屏幕窗口操作函数*/#include<ctype.h>                  /*分类函数*/char prog[80]={'\0'},     token[8];   

编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语

四则运算编译器,虽然说功能很简单,只能编译四则运算表达式.但是编译原理前端部分几乎都有涉及,词法分析,语法分析,还有代码生成. 再复杂的编译器.再简单的编译器,功能上是差不多的,只是复杂的编译器实现上会更困难. 这个系列的文章是为了帮助你入门,在这个基础上再去看编译原理相关书籍,不至于打瞌睡. 如果你对编译原理很有兴趣,并且想更深一步的学习,在这里强烈推荐你看一本书--我心目中的神书--<计算机系统要素-从零开始构建现代计算机>. 这本书神在哪? 神在它通俗易懂,对小白足够友好,但又不过分肤浅

编译原理学习--编译器的介绍

编译器的介绍: 编译器是一个程序,其核心功能是将源代码(C/C++,Java,C#,html等)翻译成目标代码(X86,ARM,IA64等),是一个重要的研究领域,也是其他许多研究领域的基础. 一个简单的编译器结构: 编译器由多个阶段组成,每个阶段处理不同的问题,使用不同的理论.算法和数据结构.因此,编译器设计的重要问题就是合理划分组织各个阶段,实现接口清晰,易于维护和实现. 下面是一个简单编译器的实例: 假设: 源语言:加法表达式语言Sum:有两种语法形式:1.整形数字n 2.加法e1+e2

用java实现一个简易编译器1-词法解析入门

本文对应代码下载地址为: http://download.csdn.net/detail/tyler_download/9435103 视频地址: http://v.youku.com/v_show/id_XMTQ3NTQwMDkxMg==.html?from=s1.8-1-1.2 技术的发展可谓是日新月异,层出不穷,但无论是炙手可热的大数据,还是火烧鸟了的人工智能,所有这些高大上的尖端科技无不建立在基础技术的根基之上.编译原理,计算机网络,操作系统,便是所有软件技术的基石.在这三根支柱中,维编

学了编译原理能否用 Java 写一个编译器或解释器?

16 个回答 默认排序? RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和解释器.其实用什么语言来实现编译器并不是最重要的部分(虽然Java也不是实现编译器最方便的语言),最初用啥语言都可以. 我在大学的时候,我们的软件工程和计算机科学的编译原理课的作业好像都是可以用Java来写的.反正我印象中我给这两门课写的作业都是用的Java. ===================

Linux 编译器:GCC

GCC是GNU编译套装,是一套由GNU开发的编程语言编译器. 1. 编译过程: 中间经历的若干阶段,分别是预处理,编译,汇编,链接. 2.预处理: GCC在第一阶段会调用预处理器cpp来对C源程序进行预处理,所谓的预处理就是解释源程序当中所有的预处理命令,那些例如#include,#define,#if等以井号(#)开头的语句就是预处理命令,预处理命令实际上并不是C语言本身的组成部分,而是为了更好的组织程序所使用的一些“预先处理的”工作,这些工作用一种称为与处理指令的语句来描述,然后用预处理器来

说说程序员、编译器、CPU之间的三角恋

编程工作的演进史 1.CPU需要的只是1和0组成的二进制数据 (1)不管编程怎么变,最终编程得到的可执行二进制程序都是给CPU运行的.CPU需要的只是按照CPU设计时的规律(机器指令)排布的一串二进制1和0组成的数字(机器码),CPU根本不关心这些二进制是怎么来的. (2)这些二进制可能是一个很厉害的程序员直接用1和0拼出来的:也可以是用汇编语言编写最终编译得到的:也可以是用C语言编写最终编译得到的:也可以是用java C# php bash等语言编写然后解释得到的: (3)编程工作的演进其实一

烂尾的编译器

不能再简单的编译器,也烂尾了. 也是复习c++之前,准备练手的. 记得是写到,语义分析哪里.如何处理LL文法的的 继承属性,写不下去了.LR文法倒只要处理综合属性.但是又没有时间重新写LR的语法分析模块了. 烂尾,烂尾,烂尾. 这个以后一定要补上.都快结尾了. 恩,还是重新改为lr文法来写吧. 地址