From a88529426319d66aa668882d767efb3f58a1a629 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Hannu=20Niemist=C3=B6?= Date: Wed, 31 May 2017 10:33:42 +0300 Subject: [PATCH] (refs #7250) Added new grammar rules for modular CHR rules Change-Id: I55851a496fda5b1bc135a17d37f28770b36f5007 --- .../internal/parsing/parser/SCL.grammar | 2 + .../internal/parsing/parser/SCLLexer.flex | 1 + .../internal/parsing/parser/SCLLexer.java | 448 +++++++++--------- .../internal/parsing/parser/SCLParser.dat | Bin 23546 -> 24024 bytes .../internal/parsing/parser/SCLParser.java | 247 +++++----- .../parsing/parser/SCLParserImpl.java | 12 + .../internal/parsing/parser/SCLTerminals.java | 109 ++--- 7 files changed, 428 insertions(+), 391 deletions(-) diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar index 7551271af..b0911febe 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCL.grammar @@ -55,6 +55,7 @@ declaration WHERE ruleDeclarations # RuleDefinition | MAPPING_RELATION ID atype* # MappingRelationDefinition | bexp FOLLOWS ruleDeclarations # RelationDefinition + | RULESET ID WHERE statements # RulesetDefinition ; import @@ -200,6 +201,7 @@ statement | chrQuery IMPLIES chrQuery # CHRStatement | WHEN verboseChrQuery THEN_AFTER_WHEN verboseChrQuery # VerboseCHRStatement | CONSTRAINT ID atype* # ConstraintStatement + | INCLUDE ID aexp # LocalInclude ; chrQuery diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.flex b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.flex index b064a07ae..e673b294b 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.flex +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.flex @@ -84,6 +84,7 @@ char_literal = "'" ([^'\\\ufffd] | "\\" [^\ufffd]) "'" else { return sym(SCLTerminals.ELSE); } where { return sym(SCLTerminals.WHERE); } when { return sym(SCLTerminals.WHEN); } + ruleset { return sym(SCLTerminals.RULESET); } rule { return sym(SCLTerminals.RULE); } abstract{whitespace}rule { return sym(SCLTerminals.ABSTRACT_RULE); } extends { return sym(SCLTerminals.EXTENDS); } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.java index a717005bc..5aad5eefe 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.java @@ -11,7 +11,7 @@ import gnu.trove.list.array.TIntArrayList; /** * This class is a scanner generated by * JFlex 1.6.1 - * from the specification file C:/Users/hannu/git/scl/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.flex + * from the specification file C:/GamsGui/git/platform/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLLexer.flex */ public class SCLLexer { @@ -76,17 +76,17 @@ public class SCLLexer { "\1\74\1\75\1\0\1\76\2\0\1\46\1\0\1\2"+ "\1\77\6\2\1\100\1\101\2\2\1\102\3\2\1\103"+ "\1\2\1\104\2\2\1\105\3\2\1\0\1\46\1\0"+ - "\2\2\1\106\11\2\1\107\1\2\1\110\1\2\1\111"+ - "\1\2\1\0\1\112\1\113\1\2\1\114\1\115\2\2"+ + "\3\2\1\106\11\2\1\107\1\2\1\110\1\2\1\111"+ + "\1\2\1\0\1\112\1\113\2\2\1\114\1\115\2\2"+ "\1\116\1\2\1\117\1\120\2\2\1\121\3\2\1\122"+ - "\2\2\1\123\2\2\1\124\1\125\1\0\4\2\1\126"+ - "\2\2\2\0\1\2\1\127\2\0\2\2\2\0\1\2"+ - "\2\0\1\130\1\2\2\0\1\131\2\0\1\2\4\0"+ - "\1\2\1\132\2\0\1\133\1\2\2\0\1\134\2\0"+ - "\1\135\1\0\1\136"; + "\1\123\2\2\1\124\2\2\1\125\1\126\1\0\4\2"+ + "\1\127\2\2\2\0\1\2\1\130\2\0\2\2\2\0"+ + "\1\2\2\0\1\131\1\2\2\0\1\132\2\0\1\2"+ + "\4\0\1\2\1\133\2\0\1\134\1\2\2\0\1\135"+ + "\2\0\1\136\1\0\1\137"; private static int [] zzUnpackAction() { - int [] result = new int[293]; + int [] result = new int[296]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -132,25 +132,25 @@ public class SCLLexer { "\0\370\0\u1876\0\u18b4\0\u18f2\0\u1930\0\u196e\0\u19ac\0\u19ea"+ "\0\u1a28\0\u1a66\0\u1aa4\0\u1ae2\0\u1b20\0\u1b5e\0\u1b9c\0\u1bda"+ "\0\u1c18\0\u1c56\0\u1c94\0\u1cd2\0\u1d10\0\u1d4e\0\370\0\272"+ - "\0\u1d8c\0\272\0\u1dca\0\u1e08\0\u01b2\0\u1e46\0\u1e84\0\370"+ - "\0\u1ec2\0\u1f00\0\u1f3e\0\u1f7c\0\u1fba\0\u1ff8\0\370\0\370"+ - "\0\u2036\0\u2074\0\370\0\u20b2\0\u20f0\0\u212e\0\370\0\u216c"+ - "\0\370\0\u21aa\0\u21e8\0\370\0\u2226\0\u2264\0\u22a2\0\u22e0"+ - "\0\272\0\u231e\0\u235c\0\u239a\0\u23d8\0\u2416\0\u2454\0\u2492"+ - "\0\u24d0\0\u250e\0\u254c\0\u258a\0\u25c8\0\u2606\0\370\0\u2644"+ - "\0\370\0\u2682\0\370\0\u26c0\0\u26fe\0\272\0\370\0\u273c"+ - "\0\370\0\370\0\u277a\0\u27b8\0\u27f6\0\u2834\0\370\0\370"+ - "\0\u2872\0\u28b0\0\u28ee\0\u292c\0\u296a\0\u29a8\0\272\0\u29e6"+ - "\0\u2a24\0\370\0\u2a62\0\u2aa0\0\370\0\370\0\u2ade\0\u2b1c"+ - "\0\u2b5a\0\u2b98\0\u2bd6\0\370\0\u2c14\0\u2c52\0\u2c90\0\u2cce"+ - "\0\u2d0c\0\370\0\u2d4a\0\u2d88\0\u2dc6\0\u2e04\0\u2e42\0\u2e80"+ - "\0\u2ebe\0\u2efc\0\u2f3a\0\370\0\u2f78\0\u2fb6\0\u2ff4\0\370"+ - "\0\u3032\0\u3070\0\u30ae\0\u30ec\0\u312a\0\u3168\0\u31a6\0\u31e4"+ - "\0\272\0\u3222\0\u3260\0\272\0\u329e\0\u32dc\0\u331a\0\370"+ - "\0\u3358\0\u3396\0\272\0\u33d4\0\272"; + "\0\u1d8c\0\272\0\u1dca\0\u1e08\0\u01b2\0\u1e46\0\u1e84\0\u1ec2"+ + "\0\u1f00\0\u1f3e\0\u1f7c\0\u1fba\0\u1ff8\0\u2036\0\370\0\370"+ + "\0\u2074\0\u20b2\0\370\0\u20f0\0\u212e\0\u216c\0\370\0\u21aa"+ + "\0\370\0\u21e8\0\u2226\0\370\0\u2264\0\u22a2\0\u22e0\0\u231e"+ + "\0\272\0\u235c\0\u239a\0\u23d8\0\u2416\0\u2454\0\u2492\0\u24d0"+ + "\0\u250e\0\u254c\0\u258a\0\u25c8\0\u2606\0\u2644\0\u2682\0\370"+ + "\0\u26c0\0\370\0\u26fe\0\370\0\u273c\0\u277a\0\272\0\370"+ + "\0\u27b8\0\u27f6\0\370\0\370\0\u2834\0\u2872\0\u28b0\0\u28ee"+ + "\0\370\0\370\0\u292c\0\u296a\0\u29a8\0\u29e6\0\u2a24\0\u2a62"+ + "\0\272\0\370\0\u2aa0\0\u2ade\0\370\0\u2b1c\0\u2b5a\0\370"+ + "\0\370\0\u2b98\0\u2bd6\0\u2c14\0\u2c52\0\u2c90\0\370\0\u2cce"+ + "\0\u2d0c\0\u2d4a\0\u2d88\0\u2dc6\0\370\0\u2e04\0\u2e42\0\u2e80"+ + "\0\u2ebe\0\u2efc\0\u2f3a\0\u2f78\0\u2fb6\0\u2ff4\0\370\0\u3032"+ + "\0\u3070\0\u30ae\0\370\0\u30ec\0\u312a\0\u3168\0\u31a6\0\u31e4"+ + "\0\u3222\0\u3260\0\u329e\0\272\0\u32dc\0\u331a\0\272\0\u3358"+ + "\0\u3396\0\u33d4\0\370\0\u3412\0\u3450\0\272\0\u348e\0\272"; private static int [] zzUnpackRowMap() { - int [] result = new int[293]; + int [] result = new int[296]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -346,112 +346,116 @@ public class SCLLexer { "\1\310\42\0\1\206\57\0\25\213\1\311\1\254\47\213"+ "\47\0\1\312\27\0\4\6\2\0\1\76\12\0\1\6"+ "\6\0\4\6\1\313\23\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\2\6\1\314\25\6"+ + "\2\0\1\76\12\0\1\6\6\0\12\6\1\314\15\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\17\6\1\315\10\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\3\6\1\316\24\6"+ + "\6\0\2\6\1\315\25\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\17\6\1\316\10\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\14\6\1\317\13\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\2\6\1\320\25\6"+ + "\6\0\3\6\1\317\24\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\14\6\1\320\13\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\12\6\1\321\15\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\11\6\1\322\16\6"+ + "\6\0\2\6\1\321\25\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\12\6\1\322\15\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\16\6\1\323\11\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\2\6\1\324\25\6"+ + "\6\0\11\6\1\323\16\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\16\6\1\324\11\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\11\6\1\325\16\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\16\6\1\326\11\6"+ + "\6\0\2\6\1\325\25\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\11\6\1\326\16\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\10\6\1\327\17\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\6\6\1\330\21\6"+ + "\6\0\16\6\1\327\11\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\10\6\1\330\17\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\12\6\1\331\15\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\25\6\1\332\2\6"+ + "\6\0\6\6\1\331\21\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\12\6\1\332\15\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\7\6\1\333\20\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\5\6\1\334\22\6"+ - "\11\0\1\6\5\0\2\335\16\0\1\335\6\0\1\335"+ - "\2\0\1\335\4\0\1\335\4\0\2\335\1\0\1\335"+ - "\64\0\1\336\36\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\4\6\1\337\23\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\3\6\1\340\24\6"+ + "\6\0\25\6\1\333\2\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\7\6\1\334\20\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\2\6\1\341\1\6\1\342\23\6\11\0\1\6"+ + "\6\0\5\6\1\335\22\6\11\0\1\6\5\0\2\336"+ + "\16\0\1\336\6\0\1\336\2\0\1\336\4\0\1\336"+ + "\4\0\2\336\1\0\1\336\64\0\1\337\36\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\4\6\1\340\23\6"+ + "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ + "\6\0\10\6\1\341\17\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\3\6\1\342\24\6"+ + "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ + "\6\0\2\6\1\343\1\6\1\344\23\6\11\0\1\6"+ "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\11\6"+ - "\1\343\16\6\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\20\6\1\344\7\6\11\0\1\6"+ + "\1\345\16\6\11\0\1\6\4\0\4\6\2\0\1\76"+ + "\12\0\1\6\6\0\20\6\1\346\7\6\11\0\1\6"+ "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\6\6"+ - "\1\345\21\6\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\1\346\27\6\11\0\1\6\4\0"+ - "\4\6\2\0\1\76\12\0\1\6\6\0\23\6\1\347"+ + "\1\347\21\6\11\0\1\6\4\0\4\6\2\0\1\76"+ + "\12\0\1\6\6\0\1\350\27\6\11\0\1\6\4\0"+ + "\4\6\2\0\1\76\12\0\1\6\6\0\23\6\1\351"+ "\4\6\11\0\1\6\4\0\4\6\2\0\1\76\12\0"+ - "\1\6\6\0\6\6\1\350\21\6\11\0\1\6\4\0"+ - "\4\6\2\0\1\76\12\0\1\6\6\0\16\6\1\351"+ + "\1\6\6\0\6\6\1\352\21\6\11\0\1\6\4\0"+ + "\4\6\2\0\1\76\12\0\1\6\6\0\16\6\1\353"+ "\11\6\11\0\1\6\4\0\4\6\2\0\1\76\12\0"+ - "\1\6\6\0\20\6\1\352\7\6\11\0\1\6\4\0"+ - "\4\6\2\0\1\76\12\0\1\6\6\0\6\6\1\353"+ + "\1\6\6\0\20\6\1\354\7\6\11\0\1\6\4\0"+ + "\4\6\2\0\1\76\12\0\1\6\6\0\6\6\1\355"+ "\21\6\11\0\1\6\4\0\4\6\2\0\1\76\12\0"+ - "\1\6\6\0\2\6\1\354\25\6\11\0\1\6\4\0"+ - "\4\6\2\0\1\76\12\0\1\6\6\0\5\6\1\355"+ + "\1\6\6\0\2\6\1\356\25\6\11\0\1\6\4\0"+ + "\4\6\2\0\1\76\12\0\1\6\6\0\5\6\1\357"+ "\22\6\11\0\1\6\4\0\4\6\2\0\1\76\12\0"+ - "\1\6\6\0\11\6\1\356\16\6\11\0\1\6\5\0"+ - "\2\357\16\0\1\357\6\0\1\357\2\0\1\357\4\0"+ - "\1\357\4\0\2\357\1\0\1\357\25\0\4\6\2\0"+ - "\1\76\12\0\1\6\6\0\16\6\1\360\11\6\11\0"+ + "\1\6\6\0\11\6\1\360\16\6\11\0\1\6\5\0"+ + "\2\361\16\0\1\361\6\0\1\361\2\0\1\361\4\0"+ + "\1\361\4\0\2\361\1\0\1\361\25\0\4\6\2\0"+ + "\1\76\12\0\1\6\6\0\6\6\1\362\21\6\11\0"+ "\1\6\4\0\4\6\2\0\1\76\12\0\1\6\6\0"+ - "\16\6\1\361\11\6\11\0\1\6\4\0\4\6\2\0"+ - "\1\76\12\0\1\6\6\0\10\6\1\362\17\6\11\0"+ + "\16\6\1\363\11\6\11\0\1\6\4\0\4\6\2\0"+ + "\1\76\12\0\1\6\6\0\16\6\1\364\11\6\11\0"+ "\1\6\4\0\4\6\2\0\1\76\12\0\1\6\6\0"+ - "\27\6\1\363\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\1\6\1\364\26\6\11\0\1\6"+ - "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\10\6"+ - "\1\365\17\6\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\12\6\1\366\15\6\11\0\1\6"+ - "\4\0\4\6\2\0\1\76\12\0\1\6\1\0\1\367"+ - "\4\0\30\6\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\3\6\1\370\24\6\11\0\1\6"+ - "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\11\6"+ - "\1\371\16\6\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\23\6\1\372\4\6\11\0\1\6"+ - "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\6\6"+ - "\1\373\21\6\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\10\6\1\374\17\6\11\0\1\6"+ + "\10\6\1\365\17\6\11\0\1\6\4\0\4\6\2\0"+ + "\1\76\12\0\1\6\6\0\27\6\1\366\11\0\1\6"+ + "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\1\6"+ + "\1\367\26\6\11\0\1\6\4\0\4\6\2\0\1\76"+ + "\12\0\1\6\6\0\10\6\1\370\17\6\11\0\1\6"+ + "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\12\6"+ + "\1\371\15\6\11\0\1\6\4\0\4\6\2\0\1\76"+ + "\12\0\1\6\1\0\1\372\4\0\30\6\11\0\1\6"+ "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\3\6"+ - "\1\375\24\6\11\0\1\6\4\0\4\6\2\0\1\76"+ - "\12\0\1\6\6\0\2\6\1\376\25\6\11\0\1\6"+ - "\27\0\1\367\4\0\1\377\17\0\1\u0100\25\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\5\6\1\u0101\22\6"+ - "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\23\6\1\u0102\4\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\1\0\1\u0103\4\0\30\6"+ - "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\1\0\1\u0104\4\0\30\6\11\0\1\6\4\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\25\6\1\u0105\2\6"+ + "\1\373\24\6\11\0\1\6\4\0\4\6\2\0\1\76"+ + "\12\0\1\6\6\0\11\6\1\374\16\6\11\0\1\6"+ + "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\23\6"+ + "\1\375\4\6\11\0\1\6\4\0\4\6\2\0\1\76"+ + "\12\0\1\6\6\0\6\6\1\376\21\6\11\0\1\6"+ + "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\10\6"+ + "\1\377\17\6\11\0\1\6\4\0\4\6\2\0\1\76"+ + "\12\0\1\6\6\0\3\6\1\u0100\24\6\11\0\1\6"+ + "\4\0\4\6\2\0\1\76\12\0\1\6\6\0\2\6"+ + "\1\u0101\25\6\11\0\1\6\27\0\1\372\4\0\1\u0102"+ + "\17\0\1\u0103\25\0\4\6\2\0\1\76\12\0\1\6"+ + "\6\0\5\6\1\u0104\22\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\23\6\1\u0105\4\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\21\6\1\u0106\6\6\11\0\1\6\41\0\1\u0107"+ - "\75\0\1\u0108\40\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\11\6\1\u0109\16\6\11\0\1\6\27\0\1\u0103"+ - "\6\0\1\u010a\66\0\1\u0104\6\0\1\u010b\43\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\3\6\1\u010c\24\6"+ + "\1\0\1\u0106\4\0\30\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\1\0\1\u0107\4\0\30\6"+ "\11\0\1\6\4\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\3\6\1\u010d\24\6\11\0\1\6\36\0\1\u010e"+ - "\105\0\1\u010f\33\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\6\6\1\u0110\21\6\11\0\1\6\44\0\1\u0111"+ - "\101\0\1\u0112\31\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\6\6\1\u0113\21\6\11\0\1\6\46\0\1\u0114"+ - "\71\0\1\u0115\73\0\1\u0116\75\0\1\u0117\41\0\4\6"+ - "\2\0\1\76\12\0\1\6\6\0\5\6\1\u0118\22\6"+ - "\11\0\1\6\42\0\1\u0119\74\0\1\u011a\73\0\1\u011b"+ - "\102\0\1\u011c\35\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\1\6\1\u011d\26\6\11\0\1\6\45\0\1\u011e"+ - "\72\0\1\u011f\37\0\4\6\2\0\1\76\12\0\1\6"+ - "\6\0\11\6\1\u0120\16\6\11\0\1\6\52\0\1\u0121"+ - "\64\0\1\u0122\76\0\1\u0123\70\0\1\u0124\105\0\1\u0125"+ - "\33\0"; + "\6\0\25\6\1\u0108\2\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\21\6\1\u0109\6\6"+ + "\11\0\1\6\41\0\1\u010a\75\0\1\u010b\40\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\11\6\1\u010c\16\6"+ + "\11\0\1\6\27\0\1\u0106\6\0\1\u010d\66\0\1\u0107"+ + "\6\0\1\u010e\43\0\4\6\2\0\1\76\12\0\1\6"+ + "\6\0\3\6\1\u010f\24\6\11\0\1\6\4\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\3\6\1\u0110\24\6"+ + "\11\0\1\6\36\0\1\u0111\105\0\1\u0112\33\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\6\6\1\u0113\21\6"+ + "\11\0\1\6\44\0\1\u0114\101\0\1\u0115\31\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\6\6\1\u0116\21\6"+ + "\11\0\1\6\46\0\1\u0117\71\0\1\u0118\73\0\1\u0119"+ + "\75\0\1\u011a\41\0\4\6\2\0\1\76\12\0\1\6"+ + "\6\0\5\6\1\u011b\22\6\11\0\1\6\42\0\1\u011c"+ + "\74\0\1\u011d\73\0\1\u011e\102\0\1\u011f\35\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\1\6\1\u0120\26\6"+ + "\11\0\1\6\45\0\1\u0121\72\0\1\u0122\37\0\4\6"+ + "\2\0\1\76\12\0\1\6\6\0\11\6\1\u0123\16\6"+ + "\11\0\1\6\52\0\1\u0124\64\0\1\u0125\76\0\1\u0126"+ + "\70\0\1\u0127\105\0\1\u0128\33\0"; private static int [] zzUnpackTrans() { - int [] result = new int[13330]; + int [] result = new int[13516]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -495,14 +499,14 @@ public class SCLLexer { "\4\0\5\1\2\0\37\1\1\0\5\11\1\1\1\11"+ "\2\0\2\1\1\0\3\11\1\0\1\11\2\0\1\11"+ "\1\1\1\0\1\1\1\0\32\1\1\11\1\0\1\11"+ - "\2\0\1\1\1\0\31\1\1\0\1\11\1\0\22\1"+ - "\1\0\1\11\20\1\1\11\7\1\1\0\7\1\2\0"+ + "\2\0\1\1\1\0\31\1\1\0\1\11\1\0\23\1"+ + "\1\0\1\11\21\1\1\11\10\1\1\0\7\1\2\0"+ "\2\1\2\0\2\1\2\0\1\1\2\0\2\1\2\0"+ "\1\1\2\0\1\1\4\0\1\1\1\11\2\0\1\11"+ "\1\1\2\0\1\1\2\0\1\11\1\0\1\11"; private static int [] zzUnpackAttribute() { - int [] result = new int[293]; + int [] result = new int[296]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -910,11 +914,11 @@ public class SCLLexer { case STRING: { throw new SCLSyntaxErrorException(Locations.location(stringStart, yychar), "Unclosed string literal."); } - case 294: break; + case 297: break; case LONG_STRING: { throw new SCLSyntaxErrorException(Locations.location(stringStart, yychar), "Unclosed string literal."); } - case 295: break; + case 298: break; default: { return sym(SCLTerminals.EOF); } @@ -925,39 +929,39 @@ public class SCLLexer { case 1: { throw new SCLSyntaxErrorException(Locations.location(yychar, yychar+1), "Illegal character '" + yytext() + "'."); } - case 95: break; + case 96: break; case 2: { return sym(SCLTerminals.ID); } - case 96: break; + case 97: break; case 3: { return sym(SCLTerminals.INTEGER); } - case 97: break; + case 98: break; case 4: { return sym(SCLTerminals.SYMBOL, yytext().trim()); } - case 98: break; + case 99: break; case 5: { return sym(SCLTerminals.ATTACHED_HASH, "#"); } - case 99: break; + case 100: break; case 6: { return sym(SCLTerminals.ATTACHED_DOT, "."); } - case 100: break; + case 101: break; case 7: { return sym(SCLTerminals.AT); } - case 101: break; + case 102: break; case 8: { ++parenCount; return sym(SCLTerminals.LPAREN); } - case 102: break; + case 103: break; case 9: { return sym(SCLTerminals.COMMA); } - case 103: break; + case 104: break; case 10: { --parenCount; if(parenCount == 0 && !parenCountStack.isEmpty()) { @@ -970,164 +974,164 @@ public class SCLLexer { else return sym(SCLTerminals.RPAREN); } - case 104: break; + case 105: break; case 11: { return new Token(SCLTerminals.EOL, yychar, yychar+yylength(), ""); } - case 105: break; + case 106: break; case 12: { return sym(SCLTerminals.LESS, "<"); } - case 106: break; + case 107: break; case 13: { return sym(SCLTerminals.GREATER, ">"); } - case 107: break; + case 108: break; case 14: { return sym(SCLTerminals.MINUS, "-"); } - case 108: break; + case 109: break; case 15: { } - case 109: break; + case 110: break; case 16: { throw new SCLSyntaxErrorException(Locations.location(yychar, yychar+1), "Character does not conform to UTF-8 encoding."); } - case 110: break; + case 111: break; case 17: { return sym(SCLTerminals.LAMBDA); } - case 111: break; + case 112: break; case 18: { return sym(SCLTerminals.LBRACE); } - case 112: break; + case 113: break; case 19: { return sym(SCLTerminals.RBRACE); } - case 113: break; + case 114: break; case 20: { return sym(SCLTerminals.LBRACKET); } - case 114: break; + case 115: break; case 21: { return sym(SCLTerminals.RBRACKET); } - case 115: break; + case 116: break; case 22: { return sym(SCLTerminals.EQUALS); } - case 116: break; + case 117: break; case 23: { return sym(SCLTerminals.COLON); } - case 117: break; + case 118: break; case 24: { return sym(SCLTerminals.SEMICOLON); } - case 118: break; + case 119: break; case 25: { return sym(SCLTerminals.BAR); } - case 119: break; + case 120: break; case 26: { string.setLength(0); stringStart=yychar; yybegin(STRING); return sym(SCLTerminals.BEGIN_STRING); } - case 120: break; + case 121: break; case 27: { return sym(SCLTerminals.BLANK); } - case 121: break; + case 122: break; case 28: { throw new SCLSyntaxErrorException(Locations.location(yychar, yychar+1), "Tabulator is not allowed except inside string literals."); } - case 122: break; + case 123: break; case 29: { string.append( yytext() ); } - case 123: break; + case 124: break; case 30: { throw new SCLSyntaxErrorException(Locations.location(stringStart, yychar), "Unclosed string literal."); } - case 124: break; + case 125: break; case 31: { yybegin(YYINITIAL); return new Token(SCLTerminals.END_STRING, stringStart, yychar+1, string.toString()); } - case 125: break; + case 126: break; case 32: { string.append('\n'); } - case 126: break; + case 127: break; case 33: { return sym(SCLTerminals.DOTDOT, "."); } - case 127: break; + case 128: break; case 34: { return sym(SCLTerminals.SEPARATED_DOT, "."); } - case 128: break; + case 129: break; case 35: { return sym(SCLTerminals.ANNOTATION_ID); } - case 129: break; + case 130: break; case 36: { return sym(SCLTerminals.BINDS); } - case 130: break; + case 131: break; case 37: { return sym(SCLTerminals.ARROW); } - case 131: break; + case 132: break; case 38: { return sym(SCLTerminals.COMMENT); } - case 132: break; + case 133: break; case 39: { return sym(SCLTerminals.AS); } - case 133: break; + case 134: break; case 40: { return sym(SCLTerminals.IF); } - case 134: break; + case 135: break; case 41: { return sym(SCLTerminals.IN); } - case 135: break; + case 136: break; case 42: { return sym(options.supportEq ? SCLTerminals.EQ : SCLTerminals.ID); } - case 136: break; + case 137: break; case 43: { return sym(SCLTerminals.BY); } - case 137: break; + case 138: break; case 44: { return sym(SCLTerminals.DO); } - case 138: break; + case 139: break; case 45: { return sym(SCLTerminals.IMPLIES); } - case 139: break; + case 140: break; case 46: { return sym(SCLTerminals.FOLLOWS); } - case 140: break; + case 141: break; case 47: { return sym(SCLTerminals.HASTYPE); } - case 141: break; + case 142: break; case 48: { throw new SCLSyntaxErrorException(Locations.location(stringStart, yychar), "Illegal string escape character."); } - case 142: break; + case 143: break; case 49: { string.append(yytext().substring(1)); } - case 143: break; + case 144: break; case 50: { parenCountStack.add(parenCount); parenCount = 1; @@ -1135,15 +1139,15 @@ public class SCLLexer { yybegin(YYINITIAL); return new Token(SCLTerminals.SUSPEND_STRING, stringStart, yychar+1, string.toString()); } - case 144: break; + case 145: break; case 51: { string.append('\r'); } - case 145: break; + case 146: break; case 52: { string.append('\t'); } - case 146: break; + case 147: break; case 53: { parenCountStack.add(parenCount); parenCount = 1; @@ -1151,174 +1155,178 @@ public class SCLLexer { yybegin(YYINITIAL); return new Token(SCLTerminals.SUSPEND_STRING, stringStart, yychar+1, string.toString()); } - case 147: break; + case 148: break; case 54: { return sym(SCLTerminals.FLOAT); } - case 148: break; + case 149: break; case 55: { return sym(SCLTerminals.CHAR); } - case 149: break; + case 150: break; case 56: { String text = yytext(); return sym(SCLTerminals.ID, text.substring(1, text.length()-1)); } - case 150: break; + case 151: break; case 57: { String text = yytext(); return sym(SCLTerminals.SYMBOL, text.substring(1, text.length()-1)); } - case 151: break; + case 152: break; case 58: { return sym(SCLTerminals.QUERY_OP); } - case 152: break; + case 153: break; case 59: { return sym(SCLTerminals.LET); } - case 153: break; + case 154: break; case 60: { return sym(SCLTerminals.MDO); } - case 154: break; + case 155: break; case 61: { string.setLength(0); stringStart=yychar; yybegin(LONG_STRING); return sym(SCLTerminals.BEGIN_STRING); } - case 155: break; + case 156: break; case 62: { yybegin(YYINITIAL); return new Token(SCLTerminals.END_STRING, stringStart, yychar+3, string.toString()); } - case 156: break; + case 157: break; case 63: { return sym(SCLTerminals.RULE); } - case 157: break; + case 158: break; case 64: { return sym(SCLTerminals.THEN); } - case 158: break; + case 159: break; case 65: { return sym(SCLTerminals.TYPE); } - case 159: break; + case 160: break; case 66: { return sym(SCLTerminals.ELSE); } - case 160: break; + case 161: break; case 67: { return sym(SCLTerminals.WITH); } - case 161: break; + case 162: break; case 68: { return sym(SCLTerminals.WHEN); } - case 162: break; + case 163: break; case 69: { return sym(SCLTerminals.DATA); } - case 163: break; + case 164: break; case 70: { return sym(SCLTerminals.INFIX); } - case 164: break; + case 165: break; case 71: { return sym(SCLTerminals.WHERE); } - case 165: break; + case 166: break; case 72: { return sym(SCLTerminals.CLASS); } - case 166: break; + case 167: break; case 73: { return sym(SCLTerminals.MATCH); } - case 167: break; + case 168: break; case 74: { return sym(SCLTerminals.LAMBDA_MATCH); } - case 168: break; + case 169: break; case 75: { return sym(SCLTerminals.FORALL); } - case 169: break; + case 170: break; case 76: { return sym(SCLTerminals.INFIXR); } - case 170: break; + case 171: break; case 77: { return sym(SCLTerminals.INFIXL); } - case 171: break; + case 172: break; case 78: { return sym(SCLTerminals.IMPORT); } - case 172: break; + case 173: break; case 79: { return sym(SCLTerminals.HIDING); } - case 173: break; + case 174: break; case 80: { return sym(SCLTerminals.EFFECT); } - case 174: break; + case 175: break; case 81: { return sym(SCLTerminals.SELECT); } - case 175: break; + case 176: break; case 82: { string.append((char)Integer.parseInt(yytext().substring(2), 16)); } - case 176: break; + case 177: break; case 83: - { return sym(SCLTerminals.INCLUDE); + { return sym(SCLTerminals.RULESET); } - case 177: break; + case 178: break; case 84: - { return sym(SCLTerminals.ENFORCE); + { return sym(SCLTerminals.INCLUDE); } - case 178: break; + case 179: break; case 85: - { return sym(SCLTerminals.EXTENDS); + { return sym(SCLTerminals.ENFORCE); } - case 179: break; + case 180: break; case 86: - { return sym(SCLTerminals.INSTANCE); + { return sym(SCLTerminals.EXTENDS); } - case 180: break; + case 181: break; case 87: - { return sym(SCLTerminals.DERIVING); + { return sym(SCLTerminals.INSTANCE); } - case 181: break; + case 182: break; case 88: - { return sym(SCLTerminals.IMPORTJAVA); + { return sym(SCLTerminals.DERIVING); } - case 182: break; + case 183: break; case 89: - { return sym(SCLTerminals.CONSTRAINT); + { return sym(SCLTerminals.IMPORTJAVA); } - case 183: break; + case 184: break; case 90: - { return sym(SCLTerminals.SELECT_FIRST); + { return sym(SCLTerminals.CONSTRAINT); } - case 184: break; + case 185: break; case 91: - { return sym(SCLTerminals.ABSTRACT_RULE); + { return sym(SCLTerminals.SELECT_FIRST); } - case 185: break; + case 186: break; case 92: - { return sym(SCLTerminals.TRANSFORMATION); + { return sym(SCLTerminals.ABSTRACT_RULE); } - case 186: break; + case 187: break; case 93: - { return sym(SCLTerminals.SELECT_DISTINCT); + { return sym(SCLTerminals.TRANSFORMATION); } - case 187: break; + case 188: break; case 94: + { return sym(SCLTerminals.SELECT_DISTINCT); + } + case 189: break; + case 95: { return sym(SCLTerminals.MAPPING_RELATION); } - case 188: break; + case 190: break; default: zzScanError(ZZ_NO_MATCH); } diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.dat b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/parser/SCLParser.dat index 51eafba3c75c8de5febcc4628b457aa146cc94d5..3b8a4c400293523d105ea223a57485b7a3b2e43a 100644 GIT binary patch literal 24024 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