[英]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.