2017-12-21 125 views
6

Qt qmake'nin belirsiz grameriyle hala mücadele ediyorum.PEG dilbilgisinde fonksiyon argümanları nasıl tanımlanır

Şimdi parantezi içerebilir fonksiyon argümanları (örneğin regex) tanımlamak için bir yol bulamıyorum:

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

böyle işlev çağrısını açıklamak için denedim:

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] 

Böyle bir dilbilgisinde tırnak/çift tırnak kullanılmadan gömülü parantez için nasıl destek ekleyebilirim? Parantez içinde işlev argümanları ve nasıl kapanış işlevini ayırt edebilirim?

Geçerli işlev çağrısı örneği:

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

^(/ usr)?/Lib (64)?. * 'Nedir? –

+0

Sadece JS benzeri bir düzenli ifade – eraxillan

cevap

2

Eh, ben oldukça hacky çözeltisini kendimi buldum:
sadece bir sonraki ifadesi için nokta. Bu biri için faydalı olacaktır

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] 

Umut:
İşte bu şekilde kullanan basitleştirilmiş bir dilbilgisi parçasıdır.