识别浮点常量问题

识别浮点常量问题
Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description
编译器在对程序进行编译之前,首先要进行语法分析。通常,程序被分解成若干个小单元,然后和语言的语法模式进行匹配。在分析表达式的时候,变量的类型在变量声明的时候就决定了;而常量的类型需要从常量的形式来判断。

假设你是自动编译器(ACM)开发小组的一员,负责Pascal语言编译器的开发。你的任务是分析程序分解模块送来的文件,判断其中包含的字符串是否合乎语法的Pascal浮点常量。

Pascal语言对浮点常量的语法要求是:一个浮点常量除了十进制数码之外,必须带有一个小数点或一个指数(紧接在字母e或E之后,在正式文档中也被称为比例因子)。如果该浮点常量含有小数点,则在小数点两侧都至少要有一个十进制数码。当然,在整个浮点常量或指数之前,也许会出现符号+或-。指数不能包含小数。空格也许会出现在浮点常量的前后,但不会出现在浮点常量中间。

请注意Pascal语言的语法规则没有对浮点数常量的取值范围作出任何假定。
Input
输入只有一行,就是有待识别的字符串。字符串的长度不超过255。
Output
请将分析的结果按以下样例的格式输出。如果输入文件中的字符串是Pascal浮点常量,请输出字符串“YES”,否则输出字符串“NO”。
Sample Input
1.2
Sample Output
YES
Hint

输入:1                                             输出:NO 
输入:1.0e-55                                 输出:YES 
输入:e-12                                       输出:NO
输入:1e-12                                    输出:YES
输入:6.5E                                       输出:NO
输入:+4.1234567890E-9999     输出: YES

这里介绍几个可能还没有太接触过的函数
isdigit是计算机C(C++)语言中的一个函数,主要用于检查其参数是否为十进制数字字符。
find_first_of()和 find_last_of():

int find_first_of(char c, int start = 0):
              查找字符串中第1个出现的c,由位置start开始。
              如果有匹配,则返回匹配位置;否则,返回-1.默认情况下,start为0,函数搜索
              整个字符串.
int find_last_of(char c):
              查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1.
              该搜索在字符末尾查找匹配,所以没有提供起始位置。

erase()函数

用于在顺序型容器中删除容器的一个元素,有两种函数原型,c.erase(p),c.erase(b,e);
第一个删除迭代器p所指向的元素,第二个删除迭代器b,e所标记的范围内的元素,
c为容器对象,返回值都是一个迭代器,该迭代器指向被删除元素后面的元素(这个是重点)

getline()

识别浮点常量问题_第1张图片

#include

using namespace std;

int getnext(int k, char c)
{
    switch(k)
    {
    ///isdigit检查参数是否为十进制数字字符
    case 1:
        if(isdigit(c)) return 2;
        if(c == '+' || c == '-') return 3;
        return -1;
    case 2:
        if(isdigit(c)) return 2;
        if(c == '.') return 4;
        if(c == 'E' || c == 'e') return 5;
        return -1;
    case 3:
        if(isdigit(c)) return 2;
        return -1;
    case 4:
        if(isdigit(c)) return 6;
        return -1;
    case 5:
        if(isdigit(c)) return 7;
        if(c == '+' || c == '-') return 8;
        return -1;
    case 6:
        if(c == 'E' || c == 'e') return 5;
        if(isdigit(c)) return 6;
        if(c == '\0') return 0;
        return -1;
    case 7:
        if(isdigit(c)) return 7;
        if(c == '\0') return 0;
    case 8:
        if(isdigit(c)) return 7;
        return -1;
    }
}
int main()
{
    string a;
    getline(cin, a);///接收一个字符串
    ///去除字符串两边的空格
    a.erase(0, a.find_first_not_of(" "));
    a.erase(a.find_last_not_of(" ") + 1);
    int flag = 1;
    for(int i = 0; i <= a.length(); i++)
    {
        flag = getnext(flag, a[i]);
        if(flag == -1) break;
    }
    printf("%s\n", flag == 0 ? "YES" : "NO");
    return 0;
}


你可能感兴趣的:(编译原理)