2017-12-21 7 views
6

私はまだQtのqmakeのあいまいな文法と戦っています。PEG文法における関数の引数の記述方法

今、私は括弧を含めることができ、関数の引数(例えば正規表現)を記述するための方法を見つけることができません。

functionName(arg1, "arg2", ^(arg3)+$) 

私はこのような関数呼び出しを記述するために試してみた:

FunctionCall = Identifier space* "(" space* FunctionArgumentList? space* ")" space* eol* 

FunctionArgumentList = FunctionArgumentString ((space* "," space* FunctionArgumentString)*/(blank* FunctionArgumentString)*) 
FunctionArgumentString = ReplaceFunctionCall/TestFunctionCall/EnquotedString/RegularFunctionArgumentString 
RegularFunctionArgumentString = RegularFunctionArgumentStringChar+ 
RegularFunctionArgumentStringChar = !(")"/blank/","/quote/doublequote) SourceCharacter 
SourceCharacter <- [\u0000-\uFFFC] 

どのようにして、このような文法で引用符/二重引用符を含まない埋め込み括弧のサポートを追加しますか?関数の引数の中の括弧と関数を閉じる関数を区別するにはどうすればよいですか?

有効な関数呼び出しの例:

contains(CMAKE_INSTALL_LIBS_DIR, ^(/usr)?/lib(64)?.*) 
+0

'^(/ usr)とは何ですか?/ lib(64)?*? –

+0

JSのような正規表現 – eraxillan

答えて

2

さて、私はかなりハックソリューションを自分自身を見つけた:
ちょうど次の文のために、さらに見てください。これは、誰かのために有用であろう

FunctionCall = Identifier _* "(" _* FunctionArgumentList? _* ")" _* 
FunctionArgumentList = CommaSeparatedList/FunctionArgument 
CommaSeparatedList = FunctionArgument (COMMA_WS FunctionArgument?)+ 

FunctionArgument = FunctionArgumentImpl FunctionArgumentImpl* 
FunctionArgumentImpl = EnquotedString/FunctionArgumentString 
FunctionArgumentString = FunctionArgumentStringChar+ 
FunctionArgumentStringChar = !(COMMA/QUOTE/DOUBLEQUOTE/EndOfFunction) SourceCharacter 

EndOfFunction = ")" _* (
    eoi/eol 
    /"="/"+="/"*="/"-="/"~=" 
    /","/"."/"_" 
    /"("/")" 
    "{"/"}"/":"/"|" 
) 

COMMA_WS = _ "," _ 
COMMA = "," 
QUOTE = "'" 
DOUBLEQUOTE = '"' 
BACKSLASH = "\\" 
_ = [ \t] 

希望:
は、ここでは、この方法を使用して単純化された文法断片です。

関連する問題