2017-12-21 7 views
6

Ich kämpfe immer noch mit mehrdeutiger Grammatik von Qt's qmake.Wie Funktionsargumente in der PEG-Grammatik beschrieben werden

Jetzt kann ich nicht einen Weg finden, Funktionsargumente zu beschreiben, die Klammern enthalten (zB regex):

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

Ich habe versucht, Funktionsaufruf wie folgt zu beschreiben:

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] 

Wie füge ich Unterstützung für eingebettete Klammern WITHOUT Anführungszeichen/Anführungszeichen in einer solchen Grammatik hinzu? Wie unterscheide ich die Klammer innerhalb von Funktionsargumenten und schließe die Funktion?

Gültige Funktionsaufruf Beispiel:

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

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

+0

Nur ein JS-ähnlicher regulärer Ausdruck – eraxillan

Antwort

2

Nun, fand ich eine ziemlich hacky Lösung selbst:
nur weiter suchen für eine nächste Anweisung.
Hier ist eine vereinfachte Grammatik-Fragment unter Verwendung auf diese Weise:

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] 

Hope this für jemanden nützlich sein wird.

Verwandte Themen