因为我要做一个编译器,表达式求值时需要判断当前数据项是常量还是用户定义的
变量。
这里认为数值型数均为常数,其他则不是
如:CString s("123");   //是常数
    CString s("10.032"); //是常数
    CString s("adasd"); //不是常数
怎么判断?
请高人指教!谢谢!!!Bow

解决方案 »

  1.   

    CString s="10.032";
    long l;
    try
    {
      l=atol(s)
    }
    cath(...)
    {
    }
    double d 
    try
    {
      d=atof((s)
    }
    cath(...)
    {
    }
      

  2.   

    无论是使用atol或StrToInt都不能很好的满足要求,因为这两个函数在转换失败时返回的都是0。这样在函数返回值是0时,不能很好的判断到底是转换失败还是转换了"0"、"0.000"这样的字符串的正确结果。结果不能根据转换结果判断字符串到底是常量还是变量。
      

  3.   

    目前我采用了StrToIntEx来进行判断,如果转换成功(返回TRUE)则表示是常量,反之则为变量。
    这个函数在一定程度上说基本满足了我的需求,但是目前的问题是...它会将10A、10.23ASDFA等这样的字符串也认为是常量,这显然是不能接受的。大家还有没有更好的方法?
      

  4.   

    bool Check(Csring str)
    {
       char Temp;
       bool bHaveDec = false;
       str.TrimLeft();  
       for(int i=0; i<m_OpenNum.GetLength(); i++)
       {
           Temp = str.GetAt(i);
    if ((Temp <= '9') && (Temp >= '0'))
    {
               continue;
    }
    else
    {
       if (Temp != '.')
    return false;
       else
       {
    if (bHaveDec == true)
               return false;
    bHaveDec = true;
       }
    }
        }
        return true;
    }
      

  5.   

    bool Check(Csring str)
    {
       char Temp;
       bool bHaveDec = false;
       str.TrimLeft();  
       for(int i=0; i<str.GetLength(); i++)
       {
           Temp = str.GetAt(i);
    if ((Temp <= '9') && (Temp >= '0'))
    {
               continue;
    }
    else
    {
       if (Temp != '.')
    return false;
       else
       {
    if (bHaveDec == true)
               return false;
    bHaveDec = true;
       }
    }
        }
        return true;
    }
      

  6.   

    非常感谢richestbeggar的帮助。这种方法我也想过,但是考虑到自己实现可能比较复杂,需要考虑很多种情况。如10.231、00132.322、A231.32、23AB.C等等,我想知道的是,C++有没有现成的方法或者类完成这样的功能。就像Java的Integer.parseInt(...)或Double.parseDouble(...)一样,如果转换成功(表示字符串是常量)就返回相应的值,失败(变量)就抛出异常。