2017-12-21 111 views
6

Tôi vẫn đang đấu tranh với ngữ pháp mơ hồ về qmake của Qt.Cách mô tả đối số chức năng trong ngữ pháp PEG

Bây giờ tôi không thể tìm thấy một cách để mô tả đối số chức năng có thể chứa ngoặc (ví dụ regex):

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

Tôi đã cố gắng để mô tả chức năng cuộc gọi như thế này:

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] 

Làm cách nào để thêm hỗ trợ cho dấu ngoặc đơn được nhúng KHÔNG CÓ dấu ngoặc kép/dấu ngoặc kép trong ngữ pháp như vậy? Làm cách nào để phân biệt dấu ngoặc đơn bên trong các đối số hàm và hàm đóng một?

trị chức năng gọi Ví dụ:

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

'^ (/ usr) là gì?/Lib (64)?. *'? –

+0

Biểu thức chính quy giống như JS – eraxillan

Trả lời

2

Vâng, tôi tìm thấy một giải pháp khá hacky bản thân mình:
chỉ cần nhìn xa hơn cho một tuyên bố tiếp theo.
Đây là một đoạn ngữ pháp đơn giản sử dụng theo cách này:

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] 

Hy vọng điều này sẽ có ích cho ai đó.

Các vấn đề liên quan