[英]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"
。 否则,它是某些标识符的开始。
如果您看到_
或从a
到z
或从A
到Z
的ASCII字母,则它是某个标识符的开头。 之后,可以跟随任意数量的下划线,字母或十进制数字。 必须对照保留关键字的集合(例如int
, const
, if
, switch
等)额外检查以这种方式解析的标识符。
如果看到从0
到9
的十进制数字,则有多种选择:八进制整数常数,十进制整数常数,十六进制整数常数,浮点常数。 您应该能够找出如何解析它们的方法与上述类似。 请记住,可以在常量后缀U
, UL
, ULL
, L
, LL
和F
如果看到的话.
您需要向前看,因为可能是那样.
或...
或.5
东西。
我将不描述文字字符或字符串常量的解析和标记化,转义序列中还有更多逻辑和更多内容。
现在,在C ++中,你必须额外分析的东西,如: ::
(延伸:
解析) .*
(扩展名的.
解析) ->*
(扩展-
解析)和更多的保留字(如new
, virtual
,等等等等,奇数像and
bitor
和not_eq
。
C ++令人惊讶。 模板尖括号现在可以一起使用,中间没有空格:
X<Y<Z> >
现在可以合法写成:
X<Y<Z>>
并且解析器必须对模板业务有足够的了解,以找出最后一个>>
是两个单独的>
。
还有一些与预处理器相关的令牌(例如#
和##
, include
, ifdef
, if
, undef
等)和难看的三字母组合序列。 而且,当然还有\\
的行级联。
这是一个有趣的小(或不是那么少)的项目,您可能会遇到很多麻烦,尤其是如果您限制可接受的输入种类时。
无论如何,您确实需要在过程中实现一些状态机,无论状态机有多简单(大多数情况下都很简单)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.