簡體   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