Support bind member.operation to interface Target<Args>.member.operation. Check exact signatures and scopes, same-receiver conformances, cycles and watch pairing. Resolve chains for native queries, editing and dispatch while retaining the terminal conformance owner and injected package dependencies. Track forwarded providers in dependency and semantic-major review machinery. Cover native get/set/watch chains, generic targets, invalid bindings, package forwarding, runtime owner authority and watch cancellation. Document the language feature and keep Studio search adoption explicitly pending. No push or deployment.
559 lines
11 KiB
ANTLR
559 lines
11 KiB
ANTLR
grammar QuixosCapability;
|
|
|
|
document
|
|
: workspaceDecl EOF
|
|
| interfaceResourceDecl EOF
|
|
| packageResourceDecl EOF
|
|
| fragmentDecl EOF
|
|
;
|
|
|
|
fragmentDecl
|
|
: FRAGMENT LBRACE workspaceItem* RBRACE
|
|
;
|
|
|
|
sourceImportDecl
|
|
: IMPORT stringLiteral SEMI
|
|
;
|
|
|
|
workspaceDecl
|
|
: WORKSPACE identifier ID stringLiteral REVISION stringLiteral COMMIT stringLiteral
|
|
LBRACE workspaceItem* RBRACE
|
|
;
|
|
|
|
workspaceItem
|
|
: sourceImportDecl
|
|
| atomDecl
|
|
| resourceImportDecl
|
|
| sharedAttachmentDecl
|
|
| conformanceDecl
|
|
| constructorBindingDecl
|
|
| typeAliasDecl
|
|
;
|
|
|
|
resourceImportDecl
|
|
: IMPORT INTERFACE identifier SEMI
|
|
| IMPORT PACKAGE identifier SEMI
|
|
;
|
|
|
|
externalAtomDecl
|
|
: EXTERNAL ATOM identifier ID stringLiteral SEMI
|
|
;
|
|
|
|
externalInterfaceDecl
|
|
: EXTERNAL INTERFACE identifier REVISION stringLiteral SEMI
|
|
;
|
|
|
|
resourcePreamble
|
|
: resourceImportDecl
|
|
| externalAtomDecl
|
|
| externalInterfaceDecl
|
|
| typeAliasDecl
|
|
;
|
|
|
|
atomDecl
|
|
: ATOM identifier ID stringLiteral (DOC stringLiteral)? SEMI
|
|
;
|
|
|
|
interfaceResourceDecl
|
|
: resourcePreamble* INTERFACE identifier typeParameters? ID stringLiteral REVISION stringLiteral
|
|
(REQUIRES interfaceType (COMMA interfaceType)*)?
|
|
LBRACE interfaceMember* RBRACE
|
|
;
|
|
|
|
typeParameters
|
|
: LT typeParameter (COMMA typeParameter)* GT
|
|
;
|
|
|
|
typeParameter
|
|
: VALUE identifier (COLON STORABLE)?
|
|
| OBJECT identifier (IMPLEMENTS interfaceType (AMP interfaceType)*)?
|
|
;
|
|
|
|
interfaceType
|
|
: identifier typeArguments?
|
|
;
|
|
|
|
typeArguments
|
|
: LT typeArgument (COMMA typeArgument)* GT
|
|
;
|
|
|
|
typeArgument
|
|
: ATOM identifier
|
|
| INTERFACE interfaceType
|
|
| OBJECT identifier
|
|
| valueType
|
|
;
|
|
|
|
typeAliasDecl
|
|
: TYPE identifier typeParameters? EQUAL valueType SEMI
|
|
;
|
|
|
|
interfaceMember
|
|
: valueMember
|
|
| relationshipMember
|
|
| operationMember
|
|
;
|
|
|
|
operationMember
|
|
: STATIC? OPERATION identifier ID stringLiteral COLON valueType ARROW valueType
|
|
LBRACE CALL ID stringLiteral SEMI RBRACE
|
|
;
|
|
|
|
valueMember
|
|
: queryReadContract? VALUE identifier ID stringLiteral COLON valueType
|
|
LBRACE valueMemberOperation* RBRACE
|
|
;
|
|
|
|
valueMemberOperation
|
|
: GET ID stringLiteral SEMI
|
|
| SET ID stringLiteral SEMI
|
|
| WATCH START ID stringLiteral STOP ID stringLiteral SEMI
|
|
;
|
|
|
|
relationshipMember
|
|
: queryReadContract? RELATION identifier ID stringLiteral COLON cardinality targetConstraint ORDERED? (KEYED stringLiteral)?
|
|
LBRACE relationshipOperation* RBRACE
|
|
;
|
|
|
|
queryReadContract
|
|
: QUERYABLE RPC?
|
|
;
|
|
|
|
relationshipOperation
|
|
: RESOLVE ID stringLiteral SEMI
|
|
| CONNECT ID stringLiteral SEMI
|
|
| DISCONNECT ID stringLiteral SEMI
|
|
| WATCH START ID stringLiteral STOP ID stringLiteral SEMI
|
|
;
|
|
|
|
targetConstraint
|
|
: ATOM identifier
|
|
| INTERFACE identifier typeArguments?
|
|
| OBJECT identifier
|
|
;
|
|
|
|
packageResourceDecl
|
|
: resourcePreamble* PACKAGE identifier ID stringLiteral REVISION stringLiteral
|
|
(SEMANTIC_MAJOR INTEGER)?
|
|
LBRACE packageExport* RBRACE
|
|
;
|
|
|
|
packageExport
|
|
: packageOperationExport
|
|
| packageFunctionExport
|
|
| packageConstructorExport
|
|
| packageQuery
|
|
| packageQuerySpecialization
|
|
;
|
|
|
|
packageQuery
|
|
: QUERY identifier typeParameters? ID stringLiteral ROOT WORKSPACE? interfaceType
|
|
DOCUMENT stringLiteral OPERATION stringLiteral LBRACE queryClause* RBRACE
|
|
;
|
|
|
|
packageQuerySpecialization
|
|
: QUERY identifier ID stringLiteral SPECIALIZE identifier typeArguments SEMI
|
|
;
|
|
|
|
queryClause
|
|
: FRAGMENTS stringLiteral SEMI
|
|
| VIEW OBJECT? identifier AS interfaceType SEMI
|
|
| MAX identifier INTEGER SEMI
|
|
| ALLOW interfaceType DOT identifier identifier stringLiteral SEMI
|
|
| WATCH SEMI
|
|
| POLL INTEGER stringLiteral SEMI
|
|
;
|
|
|
|
packageOperationExport
|
|
: OPERATION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType
|
|
MODE operationMode eventClause? RECEIVER receiverRequirement dependencyBlock? SEMI
|
|
;
|
|
|
|
packageFunctionExport
|
|
: FUNCTION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType
|
|
dependencyBlock? SEMI
|
|
;
|
|
|
|
packageConstructorExport
|
|
: CONSTRUCTOR identifier ID stringLiteral CONSTRUCTS identifier COLON valueType
|
|
dependencyBlock? SEMI
|
|
;
|
|
|
|
eventClause
|
|
: EMITS valueType
|
|
;
|
|
|
|
operationMode
|
|
: CALL
|
|
| WATCH_START
|
|
| WATCH_STOP
|
|
| SUBSCRIBE
|
|
| UNSUBSCRIBE
|
|
;
|
|
|
|
receiverRequirement
|
|
: ANY
|
|
| ATOM identifier
|
|
| OBJECT identifier
|
|
| INTERFACES LBRACK (interfaceType (COMMA interfaceType)*)? RBRACK
|
|
;
|
|
|
|
identifierList
|
|
: identifier (COMMA identifier)*
|
|
;
|
|
|
|
dependencyBlock
|
|
: REQUIRES LBRACE dependencyPort* RBRACE
|
|
;
|
|
|
|
dependencyPort
|
|
: STATE identifier ID stringLiteral COLON valueType primitiveList SEMI
|
|
| EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI
|
|
| INTERFACE identifier ID stringLiteral COLON identifier typeArguments? SEMI
|
|
| CONSTRUCTOR identifier ID stringLiteral COLON identifier (INPUT valueType)? SEMI
|
|
| QUERY identifier ID stringLiteral COLON identifier DOT identifier SEMI
|
|
;
|
|
|
|
primitiveList
|
|
: LBRACK primitive (COMMA primitive)* RBRACK
|
|
;
|
|
|
|
primitive
|
|
: READ
|
|
| WRITE
|
|
| RESOLVE
|
|
| CONNECT
|
|
| DISCONNECT
|
|
| WATCH_START
|
|
| WATCH_STOP
|
|
;
|
|
|
|
sharedAttachmentDecl
|
|
: SHARED attachmentDecl
|
|
;
|
|
|
|
attachmentDecl
|
|
: stateDecl
|
|
| edgeDecl
|
|
;
|
|
|
|
stateDecl
|
|
: STATE identifier ID stringLiteral ON identifier COLON valueType
|
|
POLICY storagePolicy (DEFAULT jsonLiteral)? SEMI
|
|
;
|
|
|
|
storagePolicy
|
|
: OPTIMISTIC_REGISTER
|
|
| CRDT LPAREN valueType RPAREN
|
|
;
|
|
|
|
edgeDecl
|
|
: EDGE identifier ID stringLiteral LBRACE edgeEndpoint edgeEndpoint RBRACE
|
|
;
|
|
|
|
edgeEndpoint
|
|
: targetConstraint PROJECTION identifier ID stringLiteral cardinality ORDERED?
|
|
(ON_DELETE stringLiteral)? RETAIN_OTHER? (KEYED stringLiteral)? PUBLIC_TRAVERSAL? SEMI
|
|
;
|
|
|
|
conformanceDecl
|
|
: CONFORM identifier AS identifier typeArguments? (ID stringLiteral)? (SEMANTIC_MAJOR INTEGER)?
|
|
LBRACE conformanceItem* RBRACE
|
|
;
|
|
|
|
conformanceItem
|
|
: PRIVATE attachmentDecl
|
|
| operationBindingDecl
|
|
| stateFieldBindingDecl
|
|
| relationshipMaterializationDecl
|
|
;
|
|
|
|
stateFieldBindingDecl
|
|
: BIND identifier TO STATE identifier SEMI
|
|
;
|
|
|
|
relationshipMaterializationDecl
|
|
: MATERIALIZE identifier IF ABSENT USING CONSTRUCTOR identifier VIA EDGE identifier DOT identifier SEMI
|
|
;
|
|
|
|
operationBindingDecl
|
|
: BIND memberOperationRef TO operationProvider (QUERY_REASON stringLiteral)? SEMI
|
|
;
|
|
|
|
memberOperationRef
|
|
: identifier DOT operationName
|
|
;
|
|
|
|
operationName
|
|
: identifier
|
|
| CALL
|
|
| GET
|
|
| SET
|
|
| RESOLVE
|
|
| CONNECT
|
|
| DISCONNECT
|
|
| WATCH_START
|
|
| WATCH_STOP
|
|
| SUBSCRIBE
|
|
| UNSUBSCRIBE
|
|
;
|
|
|
|
operationProvider
|
|
: STATE identifier DOT statePrimitive
|
|
| EDGE identifier DOT identifier DOT edgePrimitive
|
|
| INTERFACE identifier typeArguments? DOT memberOperationRef
|
|
| PACKAGE identifier DOT identifier typeArguments? dependencyBindingBlock?
|
|
;
|
|
|
|
statePrimitive
|
|
: READ
|
|
| WRITE
|
|
| WATCH_START
|
|
| WATCH_STOP
|
|
;
|
|
|
|
edgePrimitive
|
|
: RESOLVE
|
|
| CONNECT
|
|
| DISCONNECT
|
|
| WATCH_START
|
|
| WATCH_STOP
|
|
;
|
|
|
|
dependencyBindingBlock
|
|
: WITH LBRACE dependencyBinding* RBRACE
|
|
;
|
|
|
|
dependencyBinding
|
|
: identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI
|
|
| identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI
|
|
| identifier TO INTERFACE identifier typeArguments? (VIA EDGE identifier DOT identifier)? SEMI
|
|
| identifier TO CONSTRUCTOR identifier SEMI
|
|
| identifier TO WORKSPACE? QUERY identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI
|
|
;
|
|
|
|
constructorBindingDecl
|
|
: CONSTRUCTOR identifier TO identifier DOT identifier dependencyBindingBlock? SEMI
|
|
;
|
|
|
|
valueType
|
|
: scalarType
|
|
| UNIT
|
|
| WATCH_HANDLE
|
|
| MESSAGE stringLiteral
|
|
| ATOM_REF LT identifier GT
|
|
| INTERFACE_REF LT identifier typeArguments? GT
|
|
| REF LT identifier GT
|
|
| OPTIONAL LT valueType GT
|
|
| LIST LT valueType GT
|
|
| RECORD LBRACE recordField* RBRACE
|
|
| identifier typeArguments?
|
|
;
|
|
|
|
recordField
|
|
: identifier COLON valueType SEMI
|
|
;
|
|
|
|
scalarType
|
|
: BOOL
|
|
| BYTES
|
|
| DOUBLE
|
|
| INT32
|
|
| INT64
|
|
| STRING
|
|
| UINT32
|
|
| UINT64
|
|
;
|
|
|
|
cardinality
|
|
: OPTIONAL_ONE
|
|
| EXACTLY_ONE
|
|
| MANY
|
|
| MANY_UNIQUE
|
|
;
|
|
|
|
jsonLiteral
|
|
: stringLiteral
|
|
| INTEGER
|
|
| JSON_NUMBER
|
|
| TRUE
|
|
| FALSE
|
|
| NULL
|
|
| jsonObject
|
|
| jsonArray
|
|
;
|
|
|
|
jsonObject
|
|
: LBRACE (jsonMember (COMMA jsonMember)*)? RBRACE
|
|
;
|
|
|
|
jsonMember
|
|
: stringLiteral COLON jsonLiteral
|
|
;
|
|
|
|
jsonArray
|
|
: LBRACK (jsonLiteral (COMMA jsonLiteral)*)? RBRACK
|
|
;
|
|
|
|
identifier
|
|
: IDENTIFIER
|
|
| SOURCE
|
|
| QUERY
|
|
| SPECIALIZE
|
|
| ROOT
|
|
| DOCUMENT
|
|
| FRAGMENTS
|
|
| VIEW
|
|
| MAX
|
|
| ALLOW
|
|
| POLL
|
|
| RPC
|
|
| QUERYABLE
|
|
| RESULT_BYTES
|
|
| RPC_CALLS
|
|
| DEADLINE_MS
|
|
;
|
|
|
|
stringLiteral
|
|
: STRING_LITERAL
|
|
;
|
|
|
|
WORKSPACE: 'workspace';
|
|
RESULT_BYTES: 'result-bytes';
|
|
RPC_CALLS: 'rpc-calls';
|
|
DEADLINE_MS: 'deadline-ms';
|
|
QUERY: 'query';
|
|
SPECIALIZE: 'specialize';
|
|
ROOT: 'root';
|
|
DOCUMENT: 'document';
|
|
FRAGMENTS: 'fragments';
|
|
VIEW: 'view';
|
|
MAX: 'max';
|
|
ALLOW: 'allow';
|
|
POLL: 'poll';
|
|
QUERYABLE: 'queryable';
|
|
RPC: 'rpc';
|
|
QUERY_REASON: 'query-reason';
|
|
TYPE: 'type';
|
|
OBJECT: 'object';
|
|
STORABLE: 'storable';
|
|
IMPLEMENTS: 'implements';
|
|
REF: 'ref';
|
|
FRAGMENT: 'fragment';
|
|
IMPORT: 'import';
|
|
EXTERNAL: 'external';
|
|
ATOM: 'atom';
|
|
INTERFACE: 'interface';
|
|
INTERFACES: 'interfaces';
|
|
PACKAGE: 'package';
|
|
VALUE: 'value';
|
|
RELATION: 'relation';
|
|
OPERATION: 'operation';
|
|
FUNCTION: 'function';
|
|
CONSTRUCTOR: 'constructor';
|
|
CONSTRUCTS: 'constructs';
|
|
INPUT: 'input';
|
|
CONFORM: 'conform';
|
|
AS: 'as';
|
|
BIND: 'bind';
|
|
STATIC: 'static';
|
|
TO: 'to';
|
|
PRIVATE: 'private';
|
|
SHARED: 'shared';
|
|
STATE: 'state';
|
|
EDGE: 'edge';
|
|
PROJECTION: 'projection';
|
|
WITH: 'with';
|
|
USING: 'using';
|
|
VIA: 'via';
|
|
MATERIALIZE: 'materialize';
|
|
IF: 'if';
|
|
ABSENT: 'absent';
|
|
ON: 'on';
|
|
POLICY: 'policy';
|
|
DEFAULT: 'default';
|
|
SOURCE: 'source';
|
|
REPOSITORY: 'repository';
|
|
COMMIT: 'commit';
|
|
REVISION: 'revision';
|
|
SEMANTIC_MAJOR: 'semantic-major';
|
|
ON_DELETE: 'on-delete';
|
|
RETAIN_OTHER: 'retain-other';
|
|
KEYED: 'keyed';
|
|
PUBLIC_TRAVERSAL: 'public-traversal';
|
|
ID: 'id';
|
|
DOC: 'doc';
|
|
MODE: 'mode';
|
|
EMITS: 'emits';
|
|
RECEIVER: 'receiver';
|
|
REQUIRES: 'requires';
|
|
ANY: 'any';
|
|
GET: 'get';
|
|
SET: 'set';
|
|
WATCH: 'watch';
|
|
START: 'start';
|
|
STOP: 'stop';
|
|
READ: 'read';
|
|
WRITE: 'write';
|
|
RESOLVE: 'resolve';
|
|
CONNECT: 'connect';
|
|
DISCONNECT: 'disconnect';
|
|
CALL: 'call';
|
|
WATCH_START: 'watch-start';
|
|
WATCH_STOP: 'watch-stop';
|
|
SUBSCRIBE: 'subscribe';
|
|
UNSUBSCRIBE: 'unsubscribe';
|
|
OPTIMISTIC_REGISTER: 'optimistic-register';
|
|
CRDT: 'crdt';
|
|
OPTIONAL_ONE: 'optional-one';
|
|
EXACTLY_ONE: 'exactly-one';
|
|
MANY_UNIQUE: 'many-unique';
|
|
MANY: 'many';
|
|
ORDERED: 'ordered';
|
|
UNIT: 'unit';
|
|
WATCH_HANDLE: 'watch-handle';
|
|
MESSAGE: 'message';
|
|
ATOM_REF: 'atom-ref';
|
|
INTERFACE_REF: 'interface-ref';
|
|
OPTIONAL: 'optional';
|
|
LIST: 'list';
|
|
RECORD: 'record';
|
|
BOOL: 'bool';
|
|
BYTES: 'bytes';
|
|
DOUBLE: 'double';
|
|
INT32: 'int32';
|
|
INT64: 'int64';
|
|
STRING: 'string';
|
|
UINT32: 'uint32';
|
|
UINT64: 'uint64';
|
|
TRUE: 'true';
|
|
FALSE: 'false';
|
|
NULL: 'null';
|
|
|
|
ARROW: '->';
|
|
COLON: ':';
|
|
SEMI: ';';
|
|
COMMA: ',';
|
|
DOT: '.';
|
|
LBRACE: '{';
|
|
RBRACE: '}';
|
|
LBRACK: '[';
|
|
RBRACK: ']';
|
|
LPAREN: '(';
|
|
RPAREN: ')';
|
|
LT: '<';
|
|
GT: '>';
|
|
AMP: '&';
|
|
EQUAL: '=';
|
|
|
|
INTEGER: '-'? [0-9]+;
|
|
JSON_NUMBER: '-'? ('0' | [1-9] [0-9]*) ('.' [0-9]+)? ([eE] [+-]? [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]* -> channel(HIDDEN);
|
|
BLOCK_COMMENT: '/*' .*? '*/' -> channel(HIDDEN);
|
|
WS: [ \t\r\n]+ -> channel(HIDDEN);
|