file = { SOI ~ "// !$*UTF8*$!" ~ object ~ EOI }
object = { "{" ~ field ~ (field)* ~ "}" | "{" ~ "}" }
field = { key ~ "=" ~ value ~ ";" }
key = { uuid | ident | string }
value = {
array
| object
| string
| bool
| kind
| number
| uuid
| ident
}
array = { "(" ~ value ~ ("," ~ value)* ~ ","? ~ ")" | "(" ~ ")" }
bool = { (^"YES" | ^"NO") ~ !"_" ~ !ASCII_ALPHANUMERIC }
number = @{ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)* ~ !ASCII_ALPHA }
string = @{ "\"" ~ INNER_STRING ~ "\"" }
ident = @{
(ASCII_ALPHA | ASCII_DIGIT | ("." | "/")* ~ ASCII_ALPHA{2}) ~ (ASCII_ALPHA | ASCII_DIGIT | "_" | "." | "/")*
}
uuid = @{
(ASCII_ALPHA{1} | ASCII_DIGIT{1}) ~ ASCII_ALPHANUMERIC{23} ~ !(ASCII_ALPHA | ".")
}
kind = @{
"PBXBuildFile"
| "PBXFileReference"
| "PBXLegacyTarget"
| "PBXNativeTarget"
| "PBXAggregateTarget"
| "PBXProject"
| "PBXGroup"
| "PBXHeadersBuildPhase"
| "PBXFrameworksBuildPhase"
| "XCConfigurationList"
| "PBXResourcesBuildPhase"
| "PBXShellScriptBuildPhase"
| "PBXSourcesBuildPhase"
| "PBXTargetDependency"
| "PBXVariantGroup"
| "XCBuildConfiguration"
| "PBXCopyFilesBuildPhase"
| "PBXContainerItemProxy"
| "XCVersionGroup"
| "PBXRezBuildPhase"
| "PBXBuildRule"
| "XCRemoteSwiftPackageReference"
| "XCSwiftPackageProductDependency"
}
escape = @{ "\\" ~ ("\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t" | unicode) }
unicode = @{ "u" ~ (ASCII_HEX_DIGIT{4} | ASCII_HEX_DIGIT{3} ~ ASCII_ALPHA) }
INNER_STRING = _{ (!("\"" | "\\") ~ ANY)* ~ (escape ~ INNER_STRING)? }
WHITESPACE = _{ " " | "\t" | "\r" | "\n" | ("\\" ~ unicode) }
COMMENT = _{ "/*" ~ (!"*/" ~ ANY)* ~ "*/" }