From 7a411ff1920c30afe962b5598fd78222b24650d9 Mon Sep 17 00:00:00 2001 From: Javier Lores Date: Mon, 20 Jan 2025 16:33:05 -0500 Subject: [PATCH 1/9] expanded grammar and symbols for commands --- grammar/grammar.jjt | 581 +++- src/main/java/com/cinchapi/ccl/Compiler.java | 24 +- .../java/com/cinchapi/ccl/CompilerJavaCC.java | 18 +- .../cinchapi/ccl/ConditionTreeVisitor.java | 10 +- .../java/com/cinchapi/ccl/JavaCCParser.java | 2 +- src/main/java/com/cinchapi/ccl/Parser.java | 6 +- src/main/java/com/cinchapi/ccl/Parsing.java | 4 +- .../cinchapi/ccl/generated/ASTCommand.java | 23 + .../cinchapi/ccl/generated/ASTExpression.java | 4 +- .../cinchapi/ccl/generated/ASTFunction.java | 2 +- .../com/cinchapi/ccl/generated/ASTOrder.java | 2 +- .../com/cinchapi/ccl/generated/ASTPage.java | 2 +- .../com/cinchapi/ccl/generated/Grammar.java | 3098 ++++++++++++++--- .../ccl/generated/GrammarConstants.java | 183 +- .../ccl/generated/GrammarDefaultVisitor.java | 5 +- .../ccl/generated/GrammarTokenManager.java | 1150 ++++-- .../ccl/generated/GrammarTreeConstants.java | 4 +- .../ccl/generated/GrammarVisitor.java | 3 +- .../{CommandSymbol.java => QuerySymbol.java} | 4 +- .../cinchapi/ccl/grammar/TimestampSymbol.java | 1 + .../ccl/grammar/command/AbortSymbol.java | 29 + .../ccl/grammar/command/AddSymbol.java | 62 + .../ccl/grammar/command/AuditSymbol.java | 52 + .../ccl/grammar/command/ClearSymbol.java | 96 + .../ccl/grammar/command/CommandSymbol.java | 28 + .../ccl/grammar/command/CommitSymbol.java | 29 + .../ccl/grammar/command/DescribeSymbol.java | 72 + .../ccl/grammar/command/FetchSymbol.java | 108 + .../ccl/grammar/command/FindSymbol.java | 100 + .../ccl/grammar/command/GetSymbol.java | 108 + .../ccl/grammar/command/InsertSymbol.java | 86 + .../ccl/grammar/command/LinkSymbol.java | 61 + .../ccl/grammar/command/PingSymbol.java | 64 + .../ccl/grammar/command/RemoveSymbol.java | 63 + .../ccl/grammar/command/RevertSymbol.java | 123 + .../ccl/grammar/command/SearchSymbol.java | 50 + .../ccl/grammar/command/SelectSymbol.java | 64 + .../ccl/grammar/command/SetSymbol.java | 61 + .../ccl/grammar/command/StageSymbol.java | 29 + .../ccl/grammar/command/UnlinkSymbol.java | 61 + .../grammar/command/VerifyAndSwapSymbol.java | 72 + .../grammar/command/VerifyOrSetSymbol.java | 61 + .../ccl/grammar/command/VerifySymbol.java | 75 + .../grammar/{ => condition}/Expression.java | 6 +- .../{ => condition}/ExpressionSymbol.java | 5 +- .../{ => condition}/FunctionKeySymbol.java | 3 +- .../{ => condition}/FunctionTokenSymbol.java | 3 +- .../{ => condition}/FunctionValueSymbol.java | 3 +- .../{ => condition}/OperatorSymbol.java | 4 +- .../{ => condition}/OrderComponentSymbol.java | 7 +- .../grammar/{ => condition}/OrderSymbol.java | 3 +- .../grammar/{ => condition}/PageSymbol.java | 4 +- .../ccl/syntax/BaseAbstractSyntaxTree.java | 2 +- .../java/com/cinchapi/ccl/syntax/Visitor.java | 4 +- .../ccl/syntax/command/CommandTree.java | 31 + .../ccl/syntax/{ => condition}/AndTree.java | 3 +- .../syntax/{ => condition}/ConditionTree.java | 4 +- .../{ => condition}/ConjunctionTree.java | 5 +- .../{ => condition}/ExpressionTree.java | 7 +- .../syntax/{ => condition}/FunctionTree.java | 7 +- .../ccl/syntax/{ => condition}/OrTree.java | 3 +- .../ccl/syntax/{ => condition}/OrderTree.java | 7 +- .../ccl/syntax/{ => condition}/PageTree.java | 7 +- .../QueryTree.java} | 19 +- .../ccl/type/function/KeyCclFunction.java | 2 +- .../type/function/KeyConditionFunction.java | 6 +- .../cinchapi/ccl/CompilerJavaCCLogicTest.java | 56 +- .../com/cinchapi/ccl/CompilerJavaCCTest.java | 6 +- .../java/com/cinchapi/ccl/CompilerTest.java | 24 +- .../java/com/cinchapi/ccl/GrammarTest.java | 14 +- .../cinchapi/ccl/JavaCCParserLogicTest.java | 16 +- .../com/cinchapi/ccl/JavaCCParserTest.java | 4 +- .../java/com/cinchapi/ccl/ParserTest.java | 18 +- .../com/cinchapi/ccl/syntax/VisitorTest.java | 7 +- 74 files changed, 5983 insertions(+), 987 deletions(-) create mode 100644 src/main/java/com/cinchapi/ccl/generated/ASTCommand.java rename src/main/java/com/cinchapi/ccl/grammar/{CommandSymbol.java => QuerySymbol.java} (87%) create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/AbortSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/AddSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/AuditSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/ClearSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/CommandSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/CommitSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/DescribeSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/FetchSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/FindSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/GetSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/InsertSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/LinkSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/PingSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/RemoveSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/RevertSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/SearchSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/SelectSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/SetSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/StageSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/UnlinkSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/VerifyAndSwapSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/VerifyOrSetSymbol.java create mode 100644 src/main/java/com/cinchapi/ccl/grammar/command/VerifySymbol.java rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/Expression.java (96%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/ExpressionSymbol.java (96%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/FunctionKeySymbol.java (92%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/FunctionTokenSymbol.java (91%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/FunctionValueSymbol.java (92%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/OperatorSymbol.java (92%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/OrderComponentSymbol.java (90%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/OrderSymbol.java (95%) rename src/main/java/com/cinchapi/ccl/grammar/{ => condition}/PageSymbol.java (96%) create mode 100644 src/main/java/com/cinchapi/ccl/syntax/command/CommandTree.java rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/AndTree.java (91%) rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/ConditionTree.java (88%) rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/ConjunctionTree.java (91%) rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/ExpressionTree.java (85%) rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/FunctionTree.java (76%) rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/OrTree.java (91%) rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/OrderTree.java (84%) rename src/main/java/com/cinchapi/ccl/syntax/{ => condition}/PageTree.java (84%) rename src/main/java/com/cinchapi/ccl/syntax/{CommandTree.java => condition/QueryTree.java} (83%) diff --git a/grammar/grammar.jjt b/grammar/grammar.jjt index d8d09a87..ad4586d2 100644 --- a/grammar/grammar.jjt +++ b/grammar/grammar.jjt @@ -27,25 +27,25 @@ package com.cinchapi.ccl.generated; import com.cinchapi.ccl.SyntaxException; import com.cinchapi.ccl.grammar.DirectionSymbol; -import com.cinchapi.ccl.grammar.FunctionTokenSymbol; +import com.cinchapi.ccl.grammar.condition.FunctionTokenSymbol; import com.cinchapi.ccl.grammar.KeySymbol; import com.cinchapi.ccl.grammar.ValueTokenSymbol; import com.cinchapi.ccl.type.function.KeyConditionFunction; import com.cinchapi.ccl.type.function.KeyRecordsFunction; -import com.cinchapi.ccl.grammar.FunctionKeySymbol; -import com.cinchapi.ccl.grammar.FunctionValueSymbol; +import com.cinchapi.ccl.grammar.condition.FunctionKeySymbol; +import com.cinchapi.ccl.grammar.condition.FunctionValueSymbol; import com.cinchapi.ccl.type.function.ImplicitKeyRecordFunction; import com.cinchapi.ccl.type.function.IndexFunction; import com.cinchapi.ccl.grammar.NavigationKeySymbol; import com.cinchapi.ccl.grammar.KeyTokenSymbol; -import com.cinchapi.ccl.grammar.OperatorSymbol; -import com.cinchapi.ccl.grammar.OrderComponentSymbol; +import com.cinchapi.ccl.grammar.condition.OperatorSymbol; +import com.cinchapi.ccl.grammar.condition.OrderComponentSymbol; import com.cinchapi.ccl.grammar.TimestampSymbol; import com.cinchapi.ccl.grammar.ValueSymbol; -import com.cinchapi.ccl.grammar.PageSymbol; -import com.cinchapi.ccl.grammar.OrderSymbol; +import com.cinchapi.ccl.grammar.condition.PageSymbol; +import com.cinchapi.ccl.grammar.condition.OrderSymbol; import com.cinchapi.ccl.syntax.AbstractSyntaxTree; -import com.cinchapi.ccl.syntax.ConditionTree; +import com.cinchapi.ccl.syntax.condition.ConditionTree; import com.cinchapi.ccl.type.Operator; import com.cinchapi.ccl.util.NaturalLanguage; import com.cinchapi.common.base.AnyStrings; @@ -109,6 +109,53 @@ SKIP : "\t" } +TOKEN [IGNORE_CASE]: +{ + // Data modification commands + < ADD: "add" > +| < SET: "set" > +| < REMOVE: "remove" > +| < CLEAR: "clear" > +| < VERIFY_AND_SWAP: "verifyAndSwap" | "verify_and_swap" > +| < VERIFY_OR_SET: "verifyOrSet" | "verify_or_set" > + + // Record operations +| < INSERT: "insert" > + + // Link operations +| < LINK: "link" > +| < UNLINK: "unlink" > + + // Query operations +| < SELECT: "select" > +| < FETCH: "fetch" > +| < GET: "get" > +| < DESCRIBE: "describe" > +| < AUDIT: "audit" > +| < VERIFY: "verify" > +| < SEARCH: "search" > + + // Transaction operations +| < STAGE: "stage" > +| < COMMIT: "commit" > +| < ABORT: "abort" > + + // Other tokens needed for command syntax +| < REVERT: "revert" > +| < IN: "in" > +| < INTO: "into" > +| < FROM: "from" > +| < TO: "to" > +| < AS: "as" > +| < FOR: "for" > +| < WITH: "with" > +| < AS_OF: "as of" > +| < OPEN_BRACE : "{" > +| < CLOSE_BRACE : "}" > +| < COLON : ":" > +} + + TOKEN : { < OPEN_PARENTHESES : "(" > } TOKEN : { < CLOSE_PARENTHESES : ")" > } TOKEN : { < OPEN_BRACKET : "[" > } @@ -205,6 +252,9 @@ TOKEN : ASTStart StartCommandLine() #Start : {} { ( LOOKAHEAD(4) + Command() "\n" + | + LOOKAHEAD(3) ()? DisjunctionExpression() (Order())? (Page())? "\n" | Page() "\n" @@ -219,6 +269,9 @@ ASTStart StartCommandLine() #Start : {} ASTStart generateAST() #Start : {} { ( LOOKAHEAD(4) + Command() + | + LOOKAHEAD(3) ()? DisjunctionExpression() (Order())? (Page())? | Page() @@ -671,4 +724,516 @@ FunctionValueSymbol ValueFunction() : } ) ) +} + +void Command() : {} +{ + DataModificationOperations() + | + RecordOperations() + | + LinkOperations() + | + QueryOperations() + | + TransactionOperations() + | + RevertCommand() +} + +void DataModificationOperations() : {} +{ + AddCommand() + | + SetCommand() + | + RemoveCommand() + | + ClearCommand() + | + VerifyAndSwapCommand() + | + VerifyOrSetCommand() +} + +void AddCommand() #Command : +{ + KeyTokenSymbol key; + ValueTokenSymbol value; + Token record; +} +{ + key=Key() value=UnaryValue() record= + { + jjtThis.command(new AddSymbol(key, value, Long.parseLong(record.image))); + } +} + +void SetCommand() #Command : +{ + KeyTokenSymbol key; + ValueTokenSymbol value; + Token record; +} +{ + key=Key() value=UnaryValue() record= + { + jjtThis.command(new SetSymbol(key, value, Long.parseLong(record.image))); + } +} + +void RemoveCommand() #Command : +{ + KeyTokenSymbol key; + ValueTokenSymbol value = null; + Token record; +} +{ + key=Key() ( value=UnaryValue())? ( | ) record= + { + jjtThis.command(new RemoveSymbol(key, value, Long.parseLong(record.image))); + } +} + +void ClearCommand() #Command : +{ + KeyTokenSymbol key = null; + Token record; + Collection keys = null; + Collection records = null; +} +{ + + ( + LOOKAHEAD(3) + key=Key() record= + { + jjtThis.command(new ClearSymbol(key, Long.parseLong(record.image))); + } + | + LOOKAHEAD(3) + key=Key() records=RecordCollection() + { + jjtThis.command(new ClearSymbol(key, records)); + } + | + LOOKAHEAD(3) + keys=KeyCollection() record= + { + jjtThis.command(new ClearSymbol(keys, Long.parseLong(record.image))); + } + | + keys=KeyCollection() records=RecordCollection() + { + jjtThis.command(new ClearSymbol(keys, records)); + } + ) +} + +void VerifyAndSwapCommand() #Command : +{ + KeyTokenSymbol key; + ValueTokenSymbol expected; + ValueTokenSymbol replacement; + Token record; +} +{ + key=Key() expected=UnaryValue() record= + replacement=UnaryValue() + { + jjtThis.command(new VerifyAndSwapSymbol(key, expected, replacement, Long.parseLong(record.image))); + } +} + +void VerifyOrSetCommand() #Command : +{ + KeyTokenSymbol key; + ValueTokenSymbol value; + Token record; +} +{ + key=Key() value=UnaryValue() record= + { + jjtThis.command(new VerifyOrSetSymbol(key, value, Long.parseLong(record.image))); + } +} + +void RecordOperations() : {} +{ + InsertCommand() +} + +void InsertCommand() #Command : +{ + String json; + Token record = null; + Collection records = null; +} +{ + json=JsonObject() + ( + ( | ) + ( + record= + { + jjtThis.command(new InsertSymbol(json, Long.parseLong(record.image))); + } + | + records=RecordCollection() + { + jjtThis.command(new InsertSymbol(json, records)); + } + ) + )? + { + if(record == null && records == null) { + jjtThis.command(new InsertSymbol(json)); + } + } +} + +void LinkOperations() : {} +{ + LinkCommand() + | + UnlinkCommand() +} + +void LinkCommand() #Command : +{ + KeyTokenSymbol key; + Token source; + Token destination; + Collection destinations = null; +} +{ + key=Key() source= + ( + destination= + { + Collection dest = new ArrayList(); + dest.add(Long.parseLong(destination.image)); + jjtThis.command(new LinkSymbol(key, Long.parseLong(source.image), dest)); + } + | + destinations=RecordCollection() + { + jjtThis.command(new LinkSymbol(key, Long.parseLong(source.image), destinations)); + } + ) +} + +void UnlinkCommand() #Command : +{ + KeyTokenSymbol key; + Token source; + Token destination; + Collection destinations = null; +} +{ + key=Key() source= + ( + destination= + { + Collection dest = new ArrayList(); + dest.add(Long.parseLong(destination.image)); + jjtThis.command(new UnlinkSymbol(key, Long.parseLong(source.image), dest)); + } + | + destinations=RecordCollection() + { + jjtThis.command(new UnlinkSymbol(key, Long.parseLong(source.image), destinations)); + } + ) +} + +void QueryOperations() : {} +{ + SelectCommand() + | + FetchCommand() + | + GetCommand() + | + DescribeCommand() + | + AuditCommand() + | + VerifyCommand() + | + SearchCommand() +} + +void SelectCommand() #Command : +{ + KeyTokenSymbol key; + Token record; + TimestampSymbol timestamp = null; +} +{ + key=Key() record= (timestamp=AsOfTimestamp())? + key=Key() record= (timestamp=Timestamp())? + key=Key() record= (timestamp=TimestampReadingCommand())? - { - jjtThis.command(new SelectSymbol(key, Long.parseLong(record.image), timestamp)); - } + ( + cmd = SelectCommand() + | + cmd = GetCommand() + | + cmd = FindCommand() + | + cmd = DescribeCommand() + | + cmd = VerifyCommand() + | + cmd = SearchCommand() + | + cmd = BrowseCommand() + | + cmd = ChronologizeCommand() + | + cmd = DiffCommand() + | + cmd = InventoryCommand() + | + cmd = JsonifyCommand() + | + cmd = NavigateCommand() + | + cmd = ReconcileCommand() + | + cmd = ReviewCommand() + | + cmd = TraceCommand() + ) + { return cmd; } } -void FetchCommand() #Command : -{ - KeyTokenSymbol key; +CommandSymbol SelectCommand() : { Collection> keys = null; - Token record; - Collection records = null; + KeyTokenSymbol key = null; + Token record = null; + Collection records = null; TimestampSymbol timestamp = null; } { - +