簡體   English   中英

使用C ++ 11正則表達式捕獲上下文無關文法文件的內容

[英]Using C++11 regex to capture the contents of a context-free-grammar file

前言

我正在嘗試編寫自己的上下文無關語法規范,以與我的詞法分析器/解析器的規則關聯。 它的含義與ANTLR的相似,其中大寫標識符分類為Lexer規則,小寫標識符分類為Parser規則。 它旨在接受lexer規則的字符串文字和/或正則表達式的任何組合,以及lexer / regex規則和/或解析器規則的其他解析器標識符的任何組合。 每個規則的格式為<identifier>:<expression>;

這是語法示例:

integer      : DIGIT+;        //parser rule containing at least one lexer rule
twodigits    : DIGIT DIGIT;   //parser rule containing two consecutive lexer rules
DIGIT        : [0-9];         //lexer rule containing regex
string       : '"' CHAR* '"'; //parser rule containing zero or more 
                              //  lexer rules, wrapped in two string literals
CHAR         : (LCHAR|UCHAR); //lexer rule containing two lexer rules which
                              //  will later evaluate to one of two tokens
LCHAR        : [a-z];         //lexer rule containing regex
UCHAR        : [A-Z];         //lexer rule containing regex
SPACE        : ' ';           //lexer rule containing string literal



問題

我遇到的麻煩是匹配表達式字符串的能力,因為它們的內容往往會有所不同。
我最初寫的是:
([a-zA-Z0-9_]*)(?:\\s*)(?:\\:)(?:\\s*)((?:\\'?).*(?:\\'?)(?:\\;))
作為匹配規則,這對於用單引號引起來的單個字符串文字表達式來說還可以,但是我需要擴展它以允許多個非貪婪的字符串文字以及由任意數量的空格分隔的組合語句。 我不關心在匹配的表達式中匹配潛在的正則表達式,甚至不捕獲表達式的分離部分,因為稍后將通過單獨的正則表達式操作來處理它,所以我真的只需要驗證標識符和表達式...

總而言之 ,我需要regex_search操作來使用以下匹配語法來瀏覽語法內容:

  • 一個有效的標識符 ,以一個或多個小寫或大寫字母開頭,可選地后跟任意數量的字母數字字符(只要標識符不以一個開頭或結尾,則可選地,中間可以包含任意數量的下划線字符)。
  • 任何數量的空白字符,制表符,換行符等,但不捕獲。
  • 沒有捕獲的冒號
  • 任何數量的空白字符,制表符,換行符等,但不捕獲。
  • 至少以下一項 :(按任何順序)任意數量的字符串文字(用單引號引起來,而不捕獲引號),任意數量的詞法分析器/解析器標識符,任意數量的正則表達式(用方括號括起來)。 此匹配規則的結果應將整個表達式捕獲為單個字符串,稍后將進行后期處理階段。
  • 任何數量的空白字符,制表符,換行符等,但不捕獲。
  • 分號(可選)后跟任何未捕獲的空格。
  • (可選)任意數量的未捕獲空格,后跟一個捕獲行注釋
  • 任何數量的空白字符,制表符,換行符等,但不捕獲。

是否可以將其放入單個regex_search操作中?
我在Expresso周圍一團糟,似乎無法正確完成...


更新

到目前為止,我已經能夠提出以下建議:

#/////////////////////
# Identifier
#/////////////////////
(
    (?:[a-zA-Z]+)           # At least one lower/uppercase letter
    (?:
        (?:[a-zA-Z0-9_]*)   # Zero or more alphanumeric/underscore characters,
        (?:\w+)             # explicitly followed by one or more alphanumeric
    )?                      #   characters
)

#/////////////////////
# Separator
#/////////////////////
(?:\s*)                     # Any amount of uncaptured whitespace
(?:\:)                      # An uncaptured colon
(?:\s*)                     # Any amount of uncaptured whitespace

#///////////////////////
# Expression
#///////////////////////
(
    # String Literals:
    (?:\'?)                 # An optional single quote,
    (?:                     #   which is meant to start and end a string
        (?:[^'\\] | \\.)*   #   literal, but issues several problems for
    )                       #   me (see comments below, after this code block)
    (?:\'?)
    # Other expressions
    # ????????????
)

#/////////////////////
# Line End
#/////////////////////
(?:\s*)                     # Any amount of uncaptured whitespace
(?:\;)                      # An uncaptured colon
(?:\s*)                     # Any amount of uncaptured whitespace

如您所見,我的標識符分隔符行尾運行正常。 但是表情是我完全陷入困境的地方!

我怎么能告訴我想要的正則表達式庫或者是不貪婪的字符串文字任何字符集的線端之前, 任意順序任意數量的人?

即使我只允許使用單個字符串文字,我怎么會說“如果第一個引號存在,則右引號不是可選的”

它可能並非完美無缺,並且可能需要對匹配結果的處理方式進行額外的編碼,但這似乎可行:

#/////////////////////
# Identifier
#/////////////////////
(
    (?:[a-zA-Z]+)
    (?:
        (?:[a-zA-Z0-9_]*)
        (?:\w+)
    )?
)

#/////////////////////
# Separator
#/////////////////////
(?:\s*\:\s*)

#///////////////////////
# Expression
#///////////////////////
(
    '(?:\\\\.|[^'])*'|[^']+     # Might need to be processed separately
)

#/////////////////////
# Line End
#/////////////////////
(?:\s*\;\s*)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM