grammar QuixosLock; document : QUIXOS_LOCK FRAGMENT? VERSION INTEGER LBRACE (quixosEntry | importEntry | resourceEntry)* RBRACE EOF ; quixosEntry : QUIXOS SOURCE quixosSourceBlock ; resourceEntry : resourceKind identifier SOURCE sourceBlock ; importEntry : IMPORT stringLiteral SEMI ; resourceKind : INTERFACE | PACKAGE ; sourceBlock : LBRACE REPOSITORY stringLiteral SEMI COMMIT stringLiteral SEMI RBRACE ; quixosSourceBlock : LBRACE REPOSITORY stringLiteral SEMI (POLICY sourcePolicy SEMI REF stringLiteral SEMI)? COMMIT stringLiteral SEMI RBRACE ; sourcePolicy : PINNED | TRACK_RELEASE | TRACK_DEVELOPMENT ; identifier : IDENTIFIER ; stringLiteral : STRING_LITERAL ; QUIXOS_LOCK: 'quixos-lock'; FRAGMENT: 'fragment'; VERSION: 'version'; QUIXOS: 'quixos'; SOURCE: 'source'; INTERFACE: 'interface'; PACKAGE: 'package'; REPOSITORY: 'repository'; COMMIT: 'commit'; POLICY: 'policy'; REF: 'ref'; PINNED: 'pinned'; TRACK_RELEASE: 'track-release'; TRACK_DEVELOPMENT: 'track-development'; IMPORT: 'import'; LBRACE: '{'; RBRACE: '}'; SEMI: ';'; INTEGER: [0-9]+; IDENTIFIER: [A-Za-z_] [A-Za-z0-9_]*; STRING_LITERAL: '"' (ESC | ~["\\\r\n])* '"'; fragment ESC: '\\' (["\\/bfnrt] | 'u' HEX HEX HEX HEX); fragment HEX: [0-9a-fA-F]; LINE_COMMENT: '//' ~[\r\n]* -> skip; BLOCK_COMMENT: '/*' .*? '*/' -> skip; WS: [ \t\r\n]+ -> skip;