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