zoukankan      html  css  js  c++  java
  • 词法分析096

    1.

    输入:所给文法的源程序字符串,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等

    输出:二元组 (单词种别,单词符号的属性值)构成的序列。

    2.

    3.

    <整数常数>→d|d<整数常数>

    <标识符>→L|L<字母数字>

    <关键字>→ if | then | while | do |<字母> 

    <运算符>→ + | - | * | / | = | =<等号>…

    <界符>→ , | ; | ( | ) | …

    比如: 

    S代表a^n , n>=0

    S→a|Aa

    A→a

     4.

    #include<stdio.h>
    #include<string.h>
    #include<iostream.h>
    char prog[80],token[8];
    char ch;
    int syn,p,m=0,n,row,sum=0;
    char *rwtab[6]={"begin","if","then","while","do","end"};
    void scaner()
    {
    for(n=0;n<8;n++)
    token[n]=NULL;
    ch=prog[p++];
    while(ch==' ')
    {
    ch=prog[p];
    p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    {
    m=0;
    while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    {
    token[m++]=ch;
    ch=prog[p++];
    }
    token[m++]='\0';
    p--;
    syn=10;
    for(n=0;n<6;n++)
    if(strcmp(token,rwtab[n])==0)
    {
    syn=n+1;
    break;
    }
    }
    else if((ch>='0'&&ch<='9'))
    {
    {
    sum=0;
    while((ch>='0'&&ch<='9'))
    {
    sum=sum*10+ch-'0';
    ch=prog[p++];
    }
    }
    p--;
    syn=11;
    if(sum>32767)
    syn=-1;
    }
    else switch(ch)
    
    {
    case'<':m=0;token[m++]=ch;
    ch=prog[p++];
    if(ch=='>')
    {
    syn=21;
    token[m++]=ch;
    }
    else if(ch=='=')
    {
    syn=22;
    token[m++]=ch;
    }
    else
    {
    syn=23;
    p--;
    }
    break;
    case'>':m=0;token[m++]=ch;
    ch=prog[p++];
    if(ch=='=')
    {
    syn=24;
    token[m++]=ch;
    }
    else
    {
    syn=20;
    p--;
    }
    break;
    case':':m=0;token[m++]=ch;
    ch=prog[p++];
    if(ch=='=')
    {
    syn=18;
    token[m++]=ch;
    }
    else
    {
    syn=17;
    p--;
    }
    break;
    case'*':syn=13;token[0]=ch;break;
    case'/':m=0;m=0;token[m++]=ch;
    if(ch=='*')
    {
    syn=14;token[0]=ch;}
    if(ch=='/')
    {
    token[m++]=ch;
    ch=prog[p++];
    }
    break;
    case'+':syn=15;token[0]=ch;break;
    case'-':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    case'\n':syn=-2;break;
    default:syn=-1;break;
    }
    }
    int main()
    {
    p=0;
    row=1;
    cout<<"Please input string:"<<endl;
    do
    {
    cin.get(ch);
    prog[p++]=ch;
    }
    while(ch!='#');
    p=0;
    do
    {
    scaner();
    switch(syn)
    {
    case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break;
    case -1: cout<<"Error in row"<<row<<"!"<<endl; break;
    case -2: row=row++;break;
    default: cout<<"("<<syn<<","<<token<<")"<<endl;break;
    }
    }
    while(syn!=0);
    }

    5.

  • 相关阅读:
    word20170108逛景点 Sightseeing有用的词和句子
    c# List 分页问题
    VUE界面,this.form.xxx=1赋值后,界面效果没有变化
    SQL Server使用索引视图来实现“物化视图”
    .NET CORE 实现异步处理
    当请求接口提示网络错误Error:Network Error的时候
    SheetJS js-xlsx :js实现导出Excel模板
    增加索引分析
    聚集索引与非聚集索引的总结
    Dynamics CRM-无法识别安全令牌的颁发者,若要接受来自此颁发者的安全令牌,请将 IssuerNameRegistry 配置为返回此颁发者的有效名称
  • 原文地址:https://www.cnblogs.com/a305810827/p/5924455.html
Copyright © 2011-2022 走看看