2017-12-21 137 views
6

Wciąż walczę z niejednoznaczną gramatyką Qm's qmake.Jak opisać argumenty funkcji w gramatyce PEG

Teraz nie mogę znaleźć sposób, aby opisać argumentów funkcji, które mogą zawierać nawiasów (np regex):

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

Starałem się opisać wywołanie funkcji tak:

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] 

Jak dodać obsługę nawiasów osadzonych BEZ cytatów/podwójnych cudzysłowów w gramatyce? Jak odróżnić nawias wewnątrz argumentów funkcji i funkcji zamykającej jeden?

Ważny przykład wywołanie funkcji:

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

Co to jest '^ (/ usr)?/Lib (64)?. *'? –

+0

Po prostu wyrażenie regularne podobne do JS – eraxillan

Odpowiedz

2

Cóż, znalazłem dość hacky roztworowi sobie:
wystarczy spojrzeć dalej do następnej instrukcji.
Oto fragment uproszczoną gramatykę używając w ten sposób:

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] 

Nadzieja ta będzie przydatna dla kogoś.

Powiązane problemy