2017-12-21 1 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] 

희망 :
다음은이 방법을 사용하여 간단한 문법 조각입니다.

관련 문제