繁体   English   中英

我可以在C ++中使用正则表达式使用哪些正则表达式来解析分隔符,运算符,标识符和实数?

[英]What regular expressions can I use in c++,using regex, to parse separators,operators,identifiers, and real numbers?

  for(int k = 0 ; k < 5.25;k++)
     {
      cout<<"hello"<<endl;
      }
    return 0;

我正在为包含c ++代码的简单文本文件编写一个用于词法分析的c ++程序。 例如

然后,在程序从文件中提取代码之后,它将输出到控制台:

   for: keyword
     (: separator
     int: keyword
     k: identifier
     =: operator
     0: integer
     ;: separator
     k: identifier
     <: operator
     5.25: real
     and so forth.
    I already have "(\\w+)" for words, "(\\d+)" for integers, however I don't
    know how to write any of the rest.

为了让您大致了解正则表达式的实际代码,这里就是。

     void lexical_integer(string seq)
     {

regex digits("(\\d+)");
regex_iterator<string::iterator> itd(seq.begin(), seq.end(), digits);
regex_iterator<string::iterator> end;

for (; itd != end; ++itd)
{
    cout << itd->str() <<" " <<" integer"<< endl;
}
     }

我正在寻找可以在C ++中与regex一起使用的正则表达式,所以单词:“(\\ w +)”整数:“(\\ d +)”分隔符:? 操作员: 实数:

正则表达式将很难正确处理,因为令牌化时需要维护一些状态/上下文。 最好逐个读取输入的字符并手动构建令牌。

这是适用于C的东西(稍后将在C ++中进行更多介绍):

如果看到/则需要向前看,如果还有/ ,则跳过所有内容,直到行尾。

如果/后面跟着* ,则跳过所有内容,直到另一个* ,如果* char之后的下一个不是/ ,则返回到* ,直到将/*与结尾*/匹配时结束。

通过类似的操作,您可以跳过所有注释。

如果在/后面没有/* ,则需要另外检查它是否在=后面,以区分//=

如果您看到其中任何一个,则是一个令牌: ,;?:()[]{}

如果你看到了! 您需要向前看,因为可以这样! !=
如果看到* ,则需要向前看,因为它可以是**=
如果看到% ,则需要向前看,因为它可以是%%=
如果看到^ ,则需要向前看,因为它可以是^^=
如果看到~ ,则需要向前看,因为它可以是~~=

如果看到+ ,则需要向前看,因为它可以是++++=

如果看到-您需要向前看,因为它可以是----=->

如果看到< ,则需要向前看,因为它可以是<<=<<<<=
如果看到> ,则需要向前看,因为它可以是>>=>>>>=

如果看到& ,则需要向前看,因为它可以是&&&&=
如果你看到| 您需要向前看,因为它可以是| || |=

如果看到L (或小写的l ),则需要向前看,因为它可以开始一个文字字符或字符串常量L'c'L"string" 否则,它是某些标识符的开始。

如果您看到_或从az或从AZ的ASCII字母,则它是某个标识符的开头。 之后,可以跟随任意数量的下划线,字母或十进制数字。 必须对照保留关键字的集合(例如intconstifswitch等)额外检查以这种方式解析的标识符。

如果看到从09的十进制数字,则有多种选择:八进制整数常数,十进制整数常数,十六进制整数常数,浮点常数。 您应该能够找出如何解析它们的方法与上述类似。 请记住,可以在常量后缀UULULLLLLF

如果看到的话. 您需要向前看,因为可能是那样. ....5东西。

我将不描述文字字符或字符串常量的解析和标记化,转义序列中还有更多逻辑和更多内容。

现在,在C ++中,你必须额外分析的东西,如: :: (延伸:解析) .* (扩展名的.解析) ->* (扩展-解析)和更多的保留字(如newvirtual ,等等等等,奇数像and bitornot_eq

C ++令人惊讶。 模板尖括号现在可以一起使用,中间没有空格:

X<Y<Z> >

现在可以合法写成:

X<Y<Z>>

并且解析器必须对模板业务有足够的了解,以找出最后一个>>是两个单独的>

还有一些与预处理器相关的令牌(例如###includeifdefifundef等)和难看的三字母组合序列。 而且,当然还有\\的行级联。

这是一个有趣的小(或不是那么少)的项目,您可能会遇到很多麻烦,尤其是如果您限制可接受的输入种类时。

无论如何,您确实需要在过程中实现一些状态机,无论状态机有多简单(大多数情况下都很简单)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM