diff --git a/pfdl_grammar/PFDLParser.g4 b/pfdl_grammar/PFDLParser.g4 index 7d22738..b228456 100644 --- a/pfdl_grammar/PFDLParser.g4 +++ b/pfdl_grammar/PFDLParser.g4 @@ -68,7 +68,9 @@ struct_initialization: | STARTS_WITH_UPPER_C_STR NL* json_object NL*; variable_definition: - STARTS_WITH_LOWER_C_STR COLON primitive array?; + STARTS_WITH_LOWER_C_STR COLON variable_type; + +variable_type: primitive array?; primitive: NUMBER_P @@ -137,4 +139,4 @@ json_value: json_array : JSON_ARRAY_LEFT json_value (JSON_COMMA json_value)* JSON_ARRAY_RIGHT - | JSON_ARRAY_LEFT JSON_ARRAY_RIGHT; \ No newline at end of file + | JSON_ARRAY_LEFT JSON_ARRAY_RIGHT; diff --git a/pfdl_scheduler/parser/PFDLParser.py b/pfdl_scheduler/parser/PFDLParser.py index 0f8f5ff..7db8246 100644 --- a/pfdl_scheduler/parser/PFDLParser.py +++ b/pfdl_scheduler/parser/PFDLParser.py @@ -1,4 +1,4 @@ -# Generated from PFDLParser.g4 by ANTLR 4.9.2 +# Generated from PFDLParser.g4 by ANTLR 4.9.3 # encoding: utf-8 from antlr4 import * from io import StringIO @@ -12,211 +12,212 @@ def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3A") - buf.write("\u01ac\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\u01b0\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") buf.write("\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36") - buf.write("\4\37\t\37\4 \t \4!\t!\3\2\3\2\3\2\7\2F\n\2\f\2\16\2I") - buf.write("\13\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\6\3R\n\3\r\3\16\3S\6") - buf.write("\3V\n\3\r\3\16\3W\3\3\3\3\3\3\3\4\3\4\3\4\3\4\5\4a\n\4") - buf.write("\3\4\6\4d\n\4\r\4\16\4e\3\4\5\4i\n\4\3\4\3\4\3\4\3\5\3") - buf.write("\5\3\5\3\5\6\5r\n\5\r\5\16\5s\6\5v\n\5\r\5\16\5w\3\5\3") - buf.write("\5\3\6\3\6\3\6\3\6\6\6\u0080\n\6\r\6\16\6\u0081\6\6\u0084") - buf.write("\n\6\r\6\16\6\u0085\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\5") - buf.write("\7\u0090\n\7\3\b\3\b\6\b\u0094\n\b\r\b\16\b\u0095\3\b") - buf.write("\3\b\3\b\5\b\u009b\n\b\3\b\5\b\u009e\n\b\3\b\5\b\u00a1") - buf.write("\n\b\3\t\3\t\6\t\u00a5\n\t\r\t\16\t\u00a6\3\t\3\t\3\t") - buf.write("\5\t\u00ac\n\t\3\t\5\t\u00af\n\t\3\t\5\t\u00b2\n\t\3\n") - buf.write("\3\n\3\n\3\n\6\n\u00b8\n\n\r\n\16\n\u00b9\3\n\6\n\u00bd") - buf.write("\n\n\r\n\16\n\u00be\3\n\3\n\3\13\3\13\3\13\3\13\6\13\u00c7") - buf.write("\n\13\r\13\16\13\u00c8\6\13\u00cb\n\13\r\13\16\13\u00cc") - buf.write("\3\13\3\13\3\f\3\f\3\f\6\f\u00d4\n\f\r\f\16\f\u00d5\3") - buf.write("\f\3\f\3\r\3\r\3\r\3\r\3\r\6\r\u00df\n\r\r\r\16\r\u00e0") - buf.write("\3\r\3\r\3\16\5\16\u00e6\n\16\3\16\3\16\3\16\3\16\3\16") - buf.write("\5\16\u00ed\n\16\3\16\3\16\6\16\u00f1\n\16\r\16\16\16") - buf.write("\u00f2\3\16\3\16\3\17\3\17\3\17\3\17\6\17\u00fb\n\17\r") - buf.write("\17\16\17\u00fc\3\17\3\17\3\17\5\17\u0102\n\17\3\20\3") - buf.write("\20\3\20\6\20\u0107\n\20\r\20\16\20\u0108\3\20\3\20\3") - buf.write("\21\3\21\3\21\6\21\u0110\n\21\r\21\16\21\u0111\3\21\3") - buf.write("\21\3\22\3\22\5\22\u0118\n\22\3\23\3\23\3\23\3\23\6\23") - buf.write("\u011e\n\23\r\23\16\23\u011f\3\23\3\23\3\23\3\23\7\23") - buf.write("\u0126\n\23\f\23\16\23\u0129\13\23\3\23\3\23\7\23\u012d") - buf.write("\n\23\f\23\16\23\u0130\13\23\5\23\u0132\n\23\3\24\3\24") - buf.write("\3\24\3\24\5\24\u0138\n\24\3\25\3\25\3\26\3\26\3\26\3") - buf.write("\26\5\26\u0140\n\26\6\26\u0142\n\26\r\26\16\26\u0143\3") - buf.write("\27\3\27\5\27\u0148\n\27\3\27\3\27\3\30\3\30\3\31\3\31") - buf.write("\3\31\3\31\3\31\5\31\u0153\n\31\3\32\3\32\3\32\3\32\3") - buf.write("\32\3\32\3\32\3\32\3\32\5\32\u015e\n\32\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32") - buf.write("\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u0176\n") - buf.write("\32\f\32\16\32\u0179\13\32\3\33\3\33\3\34\3\34\3\35\3") - buf.write("\35\3\35\3\35\7\35\u0183\n\35\f\35\16\35\u0186\13\35\3") - buf.write("\35\3\35\3\35\3\35\3\35\5\35\u018d\n\35\3\36\3\36\3\36") - buf.write("\3\36\3\37\3\37\3 \3 \3 \3 \3 \3 \5 \u019b\n \3!\3!\3") - buf.write("!\3!\7!\u01a1\n!\f!\16!\u01a4\13!\3!\3!\3!\3!\5!\u01aa") - buf.write("\n!\3!\2\3\62\"\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36") - buf.write(" \"$&(*,.\60\62\64\668:<>@\2\7\4\2\22\24\64\64\4\2\60") - buf.write("\60\63\63\3\2\60\61\3\2#(\4\2\32\32@@\2\u01d1\2G\3\2\2") - buf.write("\2\4L\3\2\2\2\6\\\3\2\2\2\bm\3\2\2\2\n{\3\2\2\2\f\u008f") - buf.write("\3\2\2\2\16\u00a0\3\2\2\2\20\u00b1\3\2\2\2\22\u00b3\3") - buf.write("\2\2\2\24\u00c2\3\2\2\2\26\u00d0\3\2\2\2\30\u00d9\3\2") - buf.write("\2\2\32\u00e5\3\2\2\2\34\u00f6\3\2\2\2\36\u0103\3\2\2") - buf.write("\2 \u010c\3\2\2\2\"\u0117\3\2\2\2$\u0131\3\2\2\2&\u0133") - buf.write("\3\2\2\2(\u0139\3\2\2\2*\u013b\3\2\2\2,\u0145\3\2\2\2") - buf.write(".\u014b\3\2\2\2\60\u0152\3\2\2\2\62\u015d\3\2\2\2\64\u017a") - buf.write("\3\2\2\2\66\u017c\3\2\2\28\u018c\3\2\2\2:\u018e\3\2\2") - buf.write("\2<\u0192\3\2\2\2>\u019a\3\2\2\2@\u01a9\3\2\2\2BF\7 \2") - buf.write("\2CF\5\4\3\2DF\5\6\4\2EB\3\2\2\2EC\3\2\2\2ED\3\2\2\2F") - buf.write("I\3\2\2\2GE\3\2\2\2GH\3\2\2\2HJ\3\2\2\2IG\3\2\2\2JK\7") - buf.write("\2\2\3K\3\3\2\2\2LM\7\5\2\2MN\7\64\2\2NU\7\3\2\2OQ\5&") - buf.write("\24\2PR\7 \2\2QP\3\2\2\2RS\3\2\2\2SQ\3\2\2\2ST\3\2\2\2") - buf.write("TV\3\2\2\2UO\3\2\2\2VW\3\2\2\2WU\3\2\2\2WX\3\2\2\2XY\3") - buf.write("\2\2\2YZ\7\4\2\2Z[\7\21\2\2[\5\3\2\2\2\\]\7\6\2\2]^\7") - buf.write("\63\2\2^`\7\3\2\2_a\5\b\5\2`_\3\2\2\2`a\3\2\2\2ac\3\2") - buf.write("\2\2bd\5\f\7\2cb\3\2\2\2de\3\2\2\2ec\3\2\2\2ef\3\2\2\2") - buf.write("fh\3\2\2\2gi\5\n\6\2hg\3\2\2\2hi\3\2\2\2ij\3\2\2\2jk\7") - buf.write("\4\2\2kl\7\21\2\2l\7\3\2\2\2mn\7\7\2\2nu\7\3\2\2oq\5&") - buf.write("\24\2pr\7 \2\2qp\3\2\2\2rs\3\2\2\2sq\3\2\2\2st\3\2\2\2") - buf.write("tv\3\2\2\2uo\3\2\2\2vw\3\2\2\2wu\3\2\2\2wx\3\2\2\2xy\3") - buf.write("\2\2\2yz\7\4\2\2z\t\3\2\2\2{|\7\b\2\2|\u0083\7\3\2\2}") - buf.write("\177\7\63\2\2~\u0080\7 \2\2\177~\3\2\2\2\u0080\u0081\3") - buf.write("\2\2\2\u0081\177\3\2\2\2\u0081\u0082\3\2\2\2\u0082\u0084") - buf.write("\3\2\2\2\u0083}\3\2\2\2\u0084\u0085\3\2\2\2\u0085\u0083") - buf.write("\3\2\2\2\u0085\u0086\3\2\2\2\u0086\u0087\3\2\2\2\u0087") - buf.write("\u0088\7\4\2\2\u0088\13\3\2\2\2\u0089\u0090\5\16\b\2\u008a") - buf.write("\u0090\5\20\t\2\u008b\u0090\5\26\f\2\u008c\u0090\5\30") - buf.write("\r\2\u008d\u0090\5\32\16\2\u008e\u0090\5\34\17\2\u008f") - buf.write("\u0089\3\2\2\2\u008f\u008a\3\2\2\2\u008f\u008b\3\2\2\2") - buf.write("\u008f\u008c\3\2\2\2\u008f\u008d\3\2\2\2\u008f\u008e\3") - buf.write("\2\2\2\u0090\r\3\2\2\2\u0091\u0093\7\64\2\2\u0092\u0094") - buf.write("\7 \2\2\u0093\u0092\3\2\2\2\u0094\u0095\3\2\2\2\u0095") - buf.write("\u0093\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u00a1\3\2\2\2") - buf.write("\u0097\u0098\7\64\2\2\u0098\u009a\7\3\2\2\u0099\u009b") - buf.write("\5\22\n\2\u009a\u0099\3\2\2\2\u009a\u009b\3\2\2\2\u009b") - buf.write("\u009d\3\2\2\2\u009c\u009e\5\24\13\2\u009d\u009c\3\2\2") - buf.write("\2\u009d\u009e\3\2\2\2\u009e\u009f\3\2\2\2\u009f\u00a1") - buf.write("\7\4\2\2\u00a0\u0091\3\2\2\2\u00a0\u0097\3\2\2\2\u00a1") - buf.write("\17\3\2\2\2\u00a2\u00a4\7\63\2\2\u00a3\u00a5\7 \2\2\u00a4") - buf.write("\u00a3\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\u00a4\3\2\2\2") - buf.write("\u00a6\u00a7\3\2\2\2\u00a7\u00b2\3\2\2\2\u00a8\u00a9\7") - buf.write("\63\2\2\u00a9\u00ab\7\3\2\2\u00aa\u00ac\5\22\n\2\u00ab") - buf.write("\u00aa\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00ae\3\2\2\2") - buf.write("\u00ad\u00af\5\24\13\2\u00ae\u00ad\3\2\2\2\u00ae\u00af") - buf.write("\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00b2\7\4\2\2\u00b1") - buf.write("\u00a2\3\2\2\2\u00b1\u00a8\3\2\2\2\u00b2\21\3\2\2\2\u00b3") - buf.write("\u00b4\7\7\2\2\u00b4\u00bc\7\3\2\2\u00b5\u00b7\5\"\22") - buf.write("\2\u00b6\u00b8\7 \2\2\u00b7\u00b6\3\2\2\2\u00b8\u00b9") - buf.write("\3\2\2\2\u00b9\u00b7\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba") - buf.write("\u00bd\3\2\2\2\u00bb\u00bd\5$\23\2\u00bc\u00b5\3\2\2\2") - buf.write("\u00bc\u00bb\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00bc\3") - buf.write("\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1") - buf.write("\7\4\2\2\u00c1\23\3\2\2\2\u00c2\u00c3\7\b\2\2\u00c3\u00ca") - buf.write("\7\3\2\2\u00c4\u00c6\5&\24\2\u00c5\u00c7\7 \2\2\u00c6") - buf.write("\u00c5\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\u00c6\3\2\2\2") - buf.write("\u00c8\u00c9\3\2\2\2\u00c9\u00cb\3\2\2\2\u00ca\u00c4\3") - buf.write("\2\2\2\u00cb\u00cc\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cc\u00cd") - buf.write("\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00cf\7\4\2\2\u00cf") - buf.write("\25\3\2\2\2\u00d0\u00d1\7\f\2\2\u00d1\u00d3\7\3\2\2\u00d2") - buf.write("\u00d4\5\20\t\2\u00d3\u00d2\3\2\2\2\u00d4\u00d5\3\2\2") - buf.write("\2\u00d5\u00d3\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6\u00d7") - buf.write("\3\2\2\2\u00d7\u00d8\7\4\2\2\u00d8\27\3\2\2\2\u00d9\u00da") - buf.write("\7\t\2\2\u00da\u00db\7\n\2\2\u00db\u00dc\5\62\32\2\u00dc") - buf.write("\u00de\7\3\2\2\u00dd\u00df\5\f\7\2\u00de\u00dd\3\2\2\2") - buf.write("\u00df\u00e0\3\2\2\2\u00e0\u00de\3\2\2\2\u00e0\u00e1\3") - buf.write("\2\2\2\u00e1\u00e2\3\2\2\2\u00e2\u00e3\7\4\2\2\u00e3\31") - buf.write("\3\2\2\2\u00e4\u00e6\7\f\2\2\u00e5\u00e4\3\2\2\2\u00e5") - buf.write("\u00e6\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e8\7\t\2\2") - buf.write("\u00e8\u00e9\7\63\2\2\u00e9\u00ec\7\13\2\2\u00ea\u00ed") - buf.write("\5*\26\2\u00eb\u00ed\7\60\2\2\u00ec\u00ea\3\2\2\2\u00ec") - buf.write("\u00eb\3\2\2\2\u00ed\u00ee\3\2\2\2\u00ee\u00f0\7\3\2\2") - buf.write("\u00ef\u00f1\5\f\7\2\u00f0\u00ef\3\2\2\2\u00f1\u00f2\3") - buf.write("\2\2\2\u00f2\u00f0\3\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\u00f4") - buf.write("\3\2\2\2\u00f4\u00f5\7\4\2\2\u00f5\33\3\2\2\2\u00f6\u00f7") - buf.write("\7\r\2\2\u00f7\u00f8\7\3\2\2\u00f8\u00fa\5\62\32\2\u00f9") - buf.write("\u00fb\7 \2\2\u00fa\u00f9\3\2\2\2\u00fb\u00fc\3\2\2\2") - buf.write("\u00fc\u00fa\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u00fe\3") - buf.write("\2\2\2\u00fe\u00ff\7\4\2\2\u00ff\u0101\5\36\20\2\u0100") - buf.write("\u0102\5 \21\2\u0101\u0100\3\2\2\2\u0101\u0102\3\2\2\2") - buf.write("\u0102\35\3\2\2\2\u0103\u0104\7\16\2\2\u0104\u0106\7\3") - buf.write("\2\2\u0105\u0107\5\f\7\2\u0106\u0105\3\2\2\2\u0107\u0108") - buf.write("\3\2\2\2\u0108\u0106\3\2\2\2\u0108\u0109\3\2\2\2\u0109") - buf.write("\u010a\3\2\2\2\u010a\u010b\7\4\2\2\u010b\37\3\2\2\2\u010c") - buf.write("\u010d\7\17\2\2\u010d\u010f\7\3\2\2\u010e\u0110\5\f\7") - buf.write("\2\u010f\u010e\3\2\2\2\u0110\u0111\3\2\2\2\u0111\u010f") - buf.write("\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0113\3\2\2\2\u0113") - buf.write("\u0114\7\4\2\2\u0114!\3\2\2\2\u0115\u0118\7\63\2\2\u0116") - buf.write("\u0118\5*\26\2\u0117\u0115\3\2\2\2\u0117\u0116\3\2\2\2") - buf.write("\u0118#\3\2\2\2\u0119\u011a\7\64\2\2\u011a\u011b\7\3\2") - buf.write("\2\u011b\u011d\58\35\2\u011c\u011e\7 \2\2\u011d\u011c") - buf.write("\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u011d\3\2\2\2\u011f") - buf.write("\u0120\3\2\2\2\u0120\u0121\3\2\2\2\u0121\u0122\7\4\2\2") - buf.write("\u0122\u0132\3\2\2\2\u0123\u0127\7\64\2\2\u0124\u0126") - buf.write("\7 \2\2\u0125\u0124\3\2\2\2\u0126\u0129\3\2\2\2\u0127") - buf.write("\u0125\3\2\2\2\u0127\u0128\3\2\2\2\u0128\u012a\3\2\2\2") - buf.write("\u0129\u0127\3\2\2\2\u012a\u012e\58\35\2\u012b\u012d\7") - buf.write(" \2\2\u012c\u012b\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012c") - buf.write("\3\2\2\2\u012e\u012f\3\2\2\2\u012f\u0132\3\2\2\2\u0130") - buf.write("\u012e\3\2\2\2\u0131\u0119\3\2\2\2\u0131\u0123\3\2\2\2") - buf.write("\u0132%\3\2\2\2\u0133\u0134\7\63\2\2\u0134\u0135\7\27") - buf.write("\2\2\u0135\u0137\5(\25\2\u0136\u0138\5,\27\2\u0137\u0136") - buf.write("\3\2\2\2\u0137\u0138\3\2\2\2\u0138\'\3\2\2\2\u0139\u013a") - buf.write("\t\2\2\2\u013a)\3\2\2\2\u013b\u0141\7\63\2\2\u013c\u013d") - buf.write("\7\30\2\2\u013d\u013f\7\63\2\2\u013e\u0140\5,\27\2\u013f") - buf.write("\u013e\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0142\3\2\2\2") - buf.write("\u0141\u013c\3\2\2\2\u0142\u0143\3\2\2\2\u0143\u0141\3") - buf.write("\2\2\2\u0143\u0144\3\2\2\2\u0144+\3\2\2\2\u0145\u0147") - buf.write("\7\34\2\2\u0146\u0148\t\3\2\2\u0147\u0146\3\2\2\2\u0147") - buf.write("\u0148\3\2\2\2\u0148\u0149\3\2\2\2\u0149\u014a\7\35\2") - buf.write("\2\u014a-\3\2\2\2\u014b\u014c\t\4\2\2\u014c/\3\2\2\2\u014d") - buf.write("\u0153\7\25\2\2\u014e\u0153\7\26\2\2\u014f\u0153\5.\30") - buf.write("\2\u0150\u0153\7\62\2\2\u0151\u0153\5*\26\2\u0152\u014d") - buf.write("\3\2\2\2\u0152\u014e\3\2\2\2\u0152\u014f\3\2\2\2\u0152") - buf.write("\u0150\3\2\2\2\u0152\u0151\3\2\2\2\u0153\61\3\2\2\2\u0154") - buf.write("\u0155\b\32\1\2\u0155\u0156\7!\2\2\u0156\u0157\5\62\32") - buf.write("\2\u0157\u0158\7\"\2\2\u0158\u015e\3\2\2\2\u0159\u015a") - buf.write("\5\66\34\2\u015a\u015b\5\62\32\6\u015b\u015e\3\2\2\2\u015c") - buf.write("\u015e\5\60\31\2\u015d\u0154\3\2\2\2\u015d\u0159\3\2\2") - buf.write("\2\u015d\u015c\3\2\2\2\u015e\u0177\3\2\2\2\u015f\u0160") - buf.write("\f\13\2\2\u0160\u0161\7,\2\2\u0161\u0176\5\62\32\f\u0162") - buf.write("\u0163\f\n\2\2\u0163\u0164\7-\2\2\u0164\u0176\5\62\32") - buf.write("\13\u0165\u0166\f\t\2\2\u0166\u0167\7.\2\2\u0167\u0176") - buf.write("\5\62\32\n\u0168\u0169\f\b\2\2\u0169\u016a\7/\2\2\u016a") - buf.write("\u0176\5\62\32\t\u016b\u016c\f\7\2\2\u016c\u016d\5\64") - buf.write("\33\2\u016d\u016e\5\62\32\b\u016e\u0176\3\2\2\2\u016f") - buf.write("\u0170\f\5\2\2\u0170\u0171\7)\2\2\u0171\u0176\5\62\32") - buf.write("\6\u0172\u0173\f\4\2\2\u0173\u0174\7*\2\2\u0174\u0176") - buf.write("\5\62\32\5\u0175\u015f\3\2\2\2\u0175\u0162\3\2\2\2\u0175") - buf.write("\u0165\3\2\2\2\u0175\u0168\3\2\2\2\u0175\u016b\3\2\2\2") - buf.write("\u0175\u016f\3\2\2\2\u0175\u0172\3\2\2\2\u0176\u0179\3") - buf.write("\2\2\2\u0177\u0175\3\2\2\2\u0177\u0178\3\2\2\2\u0178\63") - buf.write("\3\2\2\2\u0179\u0177\3\2\2\2\u017a\u017b\t\5\2\2\u017b") - buf.write("\65\3\2\2\2\u017c\u017d\7+\2\2\u017d\67\3\2\2\2\u017e") - buf.write("\u017f\5<\37\2\u017f\u0184\5:\36\2\u0180\u0181\7=\2\2") - buf.write("\u0181\u0183\5:\36\2\u0182\u0180\3\2\2\2\u0183\u0186\3") - buf.write("\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0187") - buf.write("\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u0188\7A\2\2\u0188") - buf.write("\u018d\3\2\2\2\u0189\u018a\5<\37\2\u018a\u018b\7A\2\2") - buf.write("\u018b\u018d\3\2\2\2\u018c\u017e\3\2\2\2\u018c\u0189\3") - buf.write("\2\2\2\u018d9\3\2\2\2\u018e\u018f\7\65\2\2\u018f\u0190") - buf.write("\78\2\2\u0190\u0191\5> \2\u0191;\3\2\2\2\u0192\u0193\t") - buf.write("\6\2\2\u0193=\3\2\2\2\u0194\u019b\7\65\2\2\u0195\u019b") - buf.write("\7\66\2\2\u0196\u019b\7\67\2\2\u0197\u019b\7>\2\2\u0198") - buf.write("\u019b\58\35\2\u0199\u019b\5@!\2\u019a\u0194\3\2\2\2\u019a") - buf.write("\u0195\3\2\2\2\u019a\u0196\3\2\2\2\u019a\u0197\3\2\2\2") - buf.write("\u019a\u0198\3\2\2\2\u019a\u0199\3\2\2\2\u019b?\3\2\2") - buf.write("\2\u019c\u019d\7;\2\2\u019d\u01a2\5> \2\u019e\u019f\7") - buf.write("=\2\2\u019f\u01a1\5> \2\u01a0\u019e\3\2\2\2\u01a1\u01a4") - buf.write("\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3") - buf.write("\u01a5\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a5\u01a6\7<\2\2") - buf.write("\u01a6\u01aa\3\2\2\2\u01a7\u01a8\7;\2\2\u01a8\u01aa\7") - buf.write("<\2\2\u01a9\u019c\3\2\2\2\u01a9\u01a7\3\2\2\2\u01aaA\3") - buf.write("\2\2\2\66EGSW`ehsw\u0081\u0085\u008f\u0095\u009a\u009d") - buf.write("\u00a0\u00a6\u00ab\u00ae\u00b1\u00b9\u00bc\u00be\u00c8") - buf.write("\u00cc\u00d5\u00e0\u00e5\u00ec\u00f2\u00fc\u0101\u0108") - buf.write("\u0111\u0117\u011f\u0127\u012e\u0131\u0137\u013f\u0143") - buf.write("\u0147\u0152\u015d\u0175\u0177\u0184\u018c\u019a\u01a2") - buf.write("\u01a9") + buf.write("\4\37\t\37\4 \t \4!\t!\4\"\t\"\3\2\3\2\3\2\7\2H\n\2\f") + buf.write("\2\16\2K\13\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\6\3T\n\3\r\3") + buf.write("\16\3U\6\3X\n\3\r\3\16\3Y\3\3\3\3\3\3\3\4\3\4\3\4\3\4") + buf.write("\5\4c\n\4\3\4\6\4f\n\4\r\4\16\4g\3\4\5\4k\n\4\3\4\3\4") + buf.write("\3\4\3\5\3\5\3\5\3\5\6\5t\n\5\r\5\16\5u\6\5x\n\5\r\5\16") + buf.write("\5y\3\5\3\5\3\6\3\6\3\6\3\6\6\6\u0082\n\6\r\6\16\6\u0083") + buf.write("\6\6\u0086\n\6\r\6\16\6\u0087\3\6\3\6\3\7\3\7\3\7\3\7") + buf.write("\3\7\3\7\5\7\u0092\n\7\3\b\3\b\6\b\u0096\n\b\r\b\16\b") + buf.write("\u0097\3\b\3\b\3\b\5\b\u009d\n\b\3\b\5\b\u00a0\n\b\3\b") + buf.write("\5\b\u00a3\n\b\3\t\3\t\6\t\u00a7\n\t\r\t\16\t\u00a8\3") + buf.write("\t\3\t\3\t\5\t\u00ae\n\t\3\t\5\t\u00b1\n\t\3\t\5\t\u00b4") + buf.write("\n\t\3\n\3\n\3\n\3\n\6\n\u00ba\n\n\r\n\16\n\u00bb\3\n") + buf.write("\6\n\u00bf\n\n\r\n\16\n\u00c0\3\n\3\n\3\13\3\13\3\13\3") + buf.write("\13\6\13\u00c9\n\13\r\13\16\13\u00ca\6\13\u00cd\n\13\r") + buf.write("\13\16\13\u00ce\3\13\3\13\3\f\3\f\3\f\6\f\u00d6\n\f\r") + buf.write("\f\16\f\u00d7\3\f\3\f\3\r\3\r\3\r\3\r\3\r\6\r\u00e1\n") + buf.write("\r\r\r\16\r\u00e2\3\r\3\r\3\16\5\16\u00e8\n\16\3\16\3") + buf.write("\16\3\16\3\16\3\16\5\16\u00ef\n\16\3\16\3\16\6\16\u00f3") + buf.write("\n\16\r\16\16\16\u00f4\3\16\3\16\3\17\3\17\3\17\3\17\6") + buf.write("\17\u00fd\n\17\r\17\16\17\u00fe\3\17\3\17\3\17\5\17\u0104") + buf.write("\n\17\3\20\3\20\3\20\6\20\u0109\n\20\r\20\16\20\u010a") + buf.write("\3\20\3\20\3\21\3\21\3\21\6\21\u0112\n\21\r\21\16\21\u0113") + buf.write("\3\21\3\21\3\22\3\22\5\22\u011a\n\22\3\23\3\23\3\23\3") + buf.write("\23\6\23\u0120\n\23\r\23\16\23\u0121\3\23\3\23\3\23\3") + buf.write("\23\7\23\u0128\n\23\f\23\16\23\u012b\13\23\3\23\3\23\7") + buf.write("\23\u012f\n\23\f\23\16\23\u0132\13\23\5\23\u0134\n\23") + buf.write("\3\24\3\24\3\24\3\24\3\25\3\25\5\25\u013c\n\25\3\26\3") + buf.write("\26\3\27\3\27\3\27\3\27\5\27\u0144\n\27\6\27\u0146\n\27") + buf.write("\r\27\16\27\u0147\3\30\3\30\5\30\u014c\n\30\3\30\3\30") + buf.write("\3\31\3\31\3\32\3\32\3\32\3\32\3\32\5\32\u0157\n\32\3") + buf.write("\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u0162") + buf.write("\n\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33") + buf.write("\3\33\7\33\u017a\n\33\f\33\16\33\u017d\13\33\3\34\3\34") + buf.write("\3\35\3\35\3\36\3\36\3\36\3\36\7\36\u0187\n\36\f\36\16") + buf.write("\36\u018a\13\36\3\36\3\36\3\36\3\36\3\36\5\36\u0191\n") + buf.write("\36\3\37\3\37\3\37\3\37\3 \3 \3!\3!\3!\3!\3!\3!\5!\u019f") + buf.write("\n!\3\"\3\"\3\"\3\"\7\"\u01a5\n\"\f\"\16\"\u01a8\13\"") + buf.write("\3\"\3\"\3\"\3\"\5\"\u01ae\n\"\3\"\2\3\64#\2\4\6\b\n\f") + buf.write("\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@") + buf.write("B\2\7\4\2\22\24\64\64\4\2\60\60\63\63\3\2\60\61\3\2#(") + buf.write("\4\2\32\32@@\2\u01d4\2I\3\2\2\2\4N\3\2\2\2\6^\3\2\2\2") + buf.write("\bo\3\2\2\2\n}\3\2\2\2\f\u0091\3\2\2\2\16\u00a2\3\2\2") + buf.write("\2\20\u00b3\3\2\2\2\22\u00b5\3\2\2\2\24\u00c4\3\2\2\2") + buf.write("\26\u00d2\3\2\2\2\30\u00db\3\2\2\2\32\u00e7\3\2\2\2\34") + buf.write("\u00f8\3\2\2\2\36\u0105\3\2\2\2 \u010e\3\2\2\2\"\u0119") + buf.write("\3\2\2\2$\u0133\3\2\2\2&\u0135\3\2\2\2(\u0139\3\2\2\2") + buf.write("*\u013d\3\2\2\2,\u013f\3\2\2\2.\u0149\3\2\2\2\60\u014f") + buf.write("\3\2\2\2\62\u0156\3\2\2\2\64\u0161\3\2\2\2\66\u017e\3") + buf.write("\2\2\28\u0180\3\2\2\2:\u0190\3\2\2\2<\u0192\3\2\2\2>\u0196") + buf.write("\3\2\2\2@\u019e\3\2\2\2B\u01ad\3\2\2\2DH\7 \2\2EH\5\4") + buf.write("\3\2FH\5\6\4\2GD\3\2\2\2GE\3\2\2\2GF\3\2\2\2HK\3\2\2\2") + buf.write("IG\3\2\2\2IJ\3\2\2\2JL\3\2\2\2KI\3\2\2\2LM\7\2\2\3M\3") + buf.write("\3\2\2\2NO\7\5\2\2OP\7\64\2\2PW\7\3\2\2QS\5&\24\2RT\7") + buf.write(" \2\2SR\3\2\2\2TU\3\2\2\2US\3\2\2\2UV\3\2\2\2VX\3\2\2") + buf.write("\2WQ\3\2\2\2XY\3\2\2\2YW\3\2\2\2YZ\3\2\2\2Z[\3\2\2\2[") + buf.write("\\\7\4\2\2\\]\7\21\2\2]\5\3\2\2\2^_\7\6\2\2_`\7\63\2\2") + buf.write("`b\7\3\2\2ac\5\b\5\2ba\3\2\2\2bc\3\2\2\2ce\3\2\2\2df\5") + buf.write("\f\7\2ed\3\2\2\2fg\3\2\2\2ge\3\2\2\2gh\3\2\2\2hj\3\2\2") + buf.write("\2ik\5\n\6\2ji\3\2\2\2jk\3\2\2\2kl\3\2\2\2lm\7\4\2\2m") + buf.write("n\7\21\2\2n\7\3\2\2\2op\7\7\2\2pw\7\3\2\2qs\5&\24\2rt") + buf.write("\7 \2\2sr\3\2\2\2tu\3\2\2\2us\3\2\2\2uv\3\2\2\2vx\3\2") + buf.write("\2\2wq\3\2\2\2xy\3\2\2\2yw\3\2\2\2yz\3\2\2\2z{\3\2\2\2") + buf.write("{|\7\4\2\2|\t\3\2\2\2}~\7\b\2\2~\u0085\7\3\2\2\177\u0081") + buf.write("\7\63\2\2\u0080\u0082\7 \2\2\u0081\u0080\3\2\2\2\u0082") + buf.write("\u0083\3\2\2\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2\2") + buf.write("\u0084\u0086\3\2\2\2\u0085\177\3\2\2\2\u0086\u0087\3\2") + buf.write("\2\2\u0087\u0085\3\2\2\2\u0087\u0088\3\2\2\2\u0088\u0089") + buf.write("\3\2\2\2\u0089\u008a\7\4\2\2\u008a\13\3\2\2\2\u008b\u0092") + buf.write("\5\16\b\2\u008c\u0092\5\20\t\2\u008d\u0092\5\26\f\2\u008e") + buf.write("\u0092\5\30\r\2\u008f\u0092\5\32\16\2\u0090\u0092\5\34") + buf.write("\17\2\u0091\u008b\3\2\2\2\u0091\u008c\3\2\2\2\u0091\u008d") + buf.write("\3\2\2\2\u0091\u008e\3\2\2\2\u0091\u008f\3\2\2\2\u0091") + buf.write("\u0090\3\2\2\2\u0092\r\3\2\2\2\u0093\u0095\7\64\2\2\u0094") + buf.write("\u0096\7 \2\2\u0095\u0094\3\2\2\2\u0096\u0097\3\2\2\2") + buf.write("\u0097\u0095\3\2\2\2\u0097\u0098\3\2\2\2\u0098\u00a3\3") + buf.write("\2\2\2\u0099\u009a\7\64\2\2\u009a\u009c\7\3\2\2\u009b") + buf.write("\u009d\5\22\n\2\u009c\u009b\3\2\2\2\u009c\u009d\3\2\2") + buf.write("\2\u009d\u009f\3\2\2\2\u009e\u00a0\5\24\13\2\u009f\u009e") + buf.write("\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\u00a1\3\2\2\2\u00a1") + buf.write("\u00a3\7\4\2\2\u00a2\u0093\3\2\2\2\u00a2\u0099\3\2\2\2") + buf.write("\u00a3\17\3\2\2\2\u00a4\u00a6\7\63\2\2\u00a5\u00a7\7 ") + buf.write("\2\2\u00a6\u00a5\3\2\2\2\u00a7\u00a8\3\2\2\2\u00a8\u00a6") + buf.write("\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00b4\3\2\2\2\u00aa") + buf.write("\u00ab\7\63\2\2\u00ab\u00ad\7\3\2\2\u00ac\u00ae\5\22\n") + buf.write("\2\u00ad\u00ac\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\u00b0") + buf.write("\3\2\2\2\u00af\u00b1\5\24\13\2\u00b0\u00af\3\2\2\2\u00b0") + buf.write("\u00b1\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b4\7\4\2\2") + buf.write("\u00b3\u00a4\3\2\2\2\u00b3\u00aa\3\2\2\2\u00b4\21\3\2") + buf.write("\2\2\u00b5\u00b6\7\7\2\2\u00b6\u00be\7\3\2\2\u00b7\u00b9") + buf.write("\5\"\22\2\u00b8\u00ba\7 \2\2\u00b9\u00b8\3\2\2\2\u00ba") + buf.write("\u00bb\3\2\2\2\u00bb\u00b9\3\2\2\2\u00bb\u00bc\3\2\2\2") + buf.write("\u00bc\u00bf\3\2\2\2\u00bd\u00bf\5$\23\2\u00be\u00b7\3") + buf.write("\2\2\2\u00be\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00be") + buf.write("\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1\u00c2\3\2\2\2\u00c2") + buf.write("\u00c3\7\4\2\2\u00c3\23\3\2\2\2\u00c4\u00c5\7\b\2\2\u00c5") + buf.write("\u00cc\7\3\2\2\u00c6\u00c8\5&\24\2\u00c7\u00c9\7 \2\2") + buf.write("\u00c8\u00c7\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00c8\3") + buf.write("\2\2\2\u00ca\u00cb\3\2\2\2\u00cb\u00cd\3\2\2\2\u00cc\u00c6") + buf.write("\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u00cc\3\2\2\2\u00ce") + buf.write("\u00cf\3\2\2\2\u00cf\u00d0\3\2\2\2\u00d0\u00d1\7\4\2\2") + buf.write("\u00d1\25\3\2\2\2\u00d2\u00d3\7\f\2\2\u00d3\u00d5\7\3") + buf.write("\2\2\u00d4\u00d6\5\20\t\2\u00d5\u00d4\3\2\2\2\u00d6\u00d7") + buf.write("\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d7\u00d8\3\2\2\2\u00d8") + buf.write("\u00d9\3\2\2\2\u00d9\u00da\7\4\2\2\u00da\27\3\2\2\2\u00db") + buf.write("\u00dc\7\t\2\2\u00dc\u00dd\7\n\2\2\u00dd\u00de\5\64\33") + buf.write("\2\u00de\u00e0\7\3\2\2\u00df\u00e1\5\f\7\2\u00e0\u00df") + buf.write("\3\2\2\2\u00e1\u00e2\3\2\2\2\u00e2\u00e0\3\2\2\2\u00e2") + buf.write("\u00e3\3\2\2\2\u00e3\u00e4\3\2\2\2\u00e4\u00e5\7\4\2\2") + buf.write("\u00e5\31\3\2\2\2\u00e6\u00e8\7\f\2\2\u00e7\u00e6\3\2") + buf.write("\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00e9\3\2\2\2\u00e9\u00ea") + buf.write("\7\t\2\2\u00ea\u00eb\7\63\2\2\u00eb\u00ee\7\13\2\2\u00ec") + buf.write("\u00ef\5,\27\2\u00ed\u00ef\7\60\2\2\u00ee\u00ec\3\2\2") + buf.write("\2\u00ee\u00ed\3\2\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f2") + buf.write("\7\3\2\2\u00f1\u00f3\5\f\7\2\u00f2\u00f1\3\2\2\2\u00f3") + buf.write("\u00f4\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f4\u00f5\3\2\2\2") + buf.write("\u00f5\u00f6\3\2\2\2\u00f6\u00f7\7\4\2\2\u00f7\33\3\2") + buf.write("\2\2\u00f8\u00f9\7\r\2\2\u00f9\u00fa\7\3\2\2\u00fa\u00fc") + buf.write("\5\64\33\2\u00fb\u00fd\7 \2\2\u00fc\u00fb\3\2\2\2\u00fd") + buf.write("\u00fe\3\2\2\2\u00fe\u00fc\3\2\2\2\u00fe\u00ff\3\2\2\2") + buf.write("\u00ff\u0100\3\2\2\2\u0100\u0101\7\4\2\2\u0101\u0103\5") + buf.write("\36\20\2\u0102\u0104\5 \21\2\u0103\u0102\3\2\2\2\u0103") + buf.write("\u0104\3\2\2\2\u0104\35\3\2\2\2\u0105\u0106\7\16\2\2\u0106") + buf.write("\u0108\7\3\2\2\u0107\u0109\5\f\7\2\u0108\u0107\3\2\2\2") + buf.write("\u0109\u010a\3\2\2\2\u010a\u0108\3\2\2\2\u010a\u010b\3") + buf.write("\2\2\2\u010b\u010c\3\2\2\2\u010c\u010d\7\4\2\2\u010d\37") + buf.write("\3\2\2\2\u010e\u010f\7\17\2\2\u010f\u0111\7\3\2\2\u0110") + buf.write("\u0112\5\f\7\2\u0111\u0110\3\2\2\2\u0112\u0113\3\2\2\2") + buf.write("\u0113\u0111\3\2\2\2\u0113\u0114\3\2\2\2\u0114\u0115\3") + buf.write("\2\2\2\u0115\u0116\7\4\2\2\u0116!\3\2\2\2\u0117\u011a") + buf.write("\7\63\2\2\u0118\u011a\5,\27\2\u0119\u0117\3\2\2\2\u0119") + buf.write("\u0118\3\2\2\2\u011a#\3\2\2\2\u011b\u011c\7\64\2\2\u011c") + buf.write("\u011d\7\3\2\2\u011d\u011f\5:\36\2\u011e\u0120\7 \2\2") + buf.write("\u011f\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121\u011f\3") + buf.write("\2\2\2\u0121\u0122\3\2\2\2\u0122\u0123\3\2\2\2\u0123\u0124") + buf.write("\7\4\2\2\u0124\u0134\3\2\2\2\u0125\u0129\7\64\2\2\u0126") + buf.write("\u0128\7 \2\2\u0127\u0126\3\2\2\2\u0128\u012b\3\2\2\2") + buf.write("\u0129\u0127\3\2\2\2\u0129\u012a\3\2\2\2\u012a\u012c\3") + buf.write("\2\2\2\u012b\u0129\3\2\2\2\u012c\u0130\5:\36\2\u012d\u012f") + buf.write("\7 \2\2\u012e\u012d\3\2\2\2\u012f\u0132\3\2\2\2\u0130") + buf.write("\u012e\3\2\2\2\u0130\u0131\3\2\2\2\u0131\u0134\3\2\2\2") + buf.write("\u0132\u0130\3\2\2\2\u0133\u011b\3\2\2\2\u0133\u0125\3") + buf.write("\2\2\2\u0134%\3\2\2\2\u0135\u0136\7\63\2\2\u0136\u0137") + buf.write("\7\27\2\2\u0137\u0138\5(\25\2\u0138\'\3\2\2\2\u0139\u013b") + buf.write("\5*\26\2\u013a\u013c\5.\30\2\u013b\u013a\3\2\2\2\u013b") + buf.write("\u013c\3\2\2\2\u013c)\3\2\2\2\u013d\u013e\t\2\2\2\u013e") + buf.write("+\3\2\2\2\u013f\u0145\7\63\2\2\u0140\u0141\7\30\2\2\u0141") + buf.write("\u0143\7\63\2\2\u0142\u0144\5.\30\2\u0143\u0142\3\2\2") + buf.write("\2\u0143\u0144\3\2\2\2\u0144\u0146\3\2\2\2\u0145\u0140") + buf.write("\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u0145\3\2\2\2\u0147") + buf.write("\u0148\3\2\2\2\u0148-\3\2\2\2\u0149\u014b\7\34\2\2\u014a") + buf.write("\u014c\t\3\2\2\u014b\u014a\3\2\2\2\u014b\u014c\3\2\2\2") + buf.write("\u014c\u014d\3\2\2\2\u014d\u014e\7\35\2\2\u014e/\3\2\2") + buf.write("\2\u014f\u0150\t\4\2\2\u0150\61\3\2\2\2\u0151\u0157\7") + buf.write("\25\2\2\u0152\u0157\7\26\2\2\u0153\u0157\5\60\31\2\u0154") + buf.write("\u0157\7\62\2\2\u0155\u0157\5,\27\2\u0156\u0151\3\2\2") + buf.write("\2\u0156\u0152\3\2\2\2\u0156\u0153\3\2\2\2\u0156\u0154") + buf.write("\3\2\2\2\u0156\u0155\3\2\2\2\u0157\63\3\2\2\2\u0158\u0159") + buf.write("\b\33\1\2\u0159\u015a\7!\2\2\u015a\u015b\5\64\33\2\u015b") + buf.write("\u015c\7\"\2\2\u015c\u0162\3\2\2\2\u015d\u015e\58\35\2") + buf.write("\u015e\u015f\5\64\33\6\u015f\u0162\3\2\2\2\u0160\u0162") + buf.write("\5\62\32\2\u0161\u0158\3\2\2\2\u0161\u015d\3\2\2\2\u0161") + buf.write("\u0160\3\2\2\2\u0162\u017b\3\2\2\2\u0163\u0164\f\13\2") + buf.write("\2\u0164\u0165\7,\2\2\u0165\u017a\5\64\33\f\u0166\u0167") + buf.write("\f\n\2\2\u0167\u0168\7-\2\2\u0168\u017a\5\64\33\13\u0169") + buf.write("\u016a\f\t\2\2\u016a\u016b\7.\2\2\u016b\u017a\5\64\33") + buf.write("\n\u016c\u016d\f\b\2\2\u016d\u016e\7/\2\2\u016e\u017a") + buf.write("\5\64\33\t\u016f\u0170\f\7\2\2\u0170\u0171\5\66\34\2\u0171") + buf.write("\u0172\5\64\33\b\u0172\u017a\3\2\2\2\u0173\u0174\f\5\2") + buf.write("\2\u0174\u0175\7)\2\2\u0175\u017a\5\64\33\6\u0176\u0177") + buf.write("\f\4\2\2\u0177\u0178\7*\2\2\u0178\u017a\5\64\33\5\u0179") + buf.write("\u0163\3\2\2\2\u0179\u0166\3\2\2\2\u0179\u0169\3\2\2\2") + buf.write("\u0179\u016c\3\2\2\2\u0179\u016f\3\2\2\2\u0179\u0173\3") + buf.write("\2\2\2\u0179\u0176\3\2\2\2\u017a\u017d\3\2\2\2\u017b\u0179") + buf.write("\3\2\2\2\u017b\u017c\3\2\2\2\u017c\65\3\2\2\2\u017d\u017b") + buf.write("\3\2\2\2\u017e\u017f\t\5\2\2\u017f\67\3\2\2\2\u0180\u0181") + buf.write("\7+\2\2\u01819\3\2\2\2\u0182\u0183\5> \2\u0183\u0188\5") + buf.write("<\37\2\u0184\u0185\7=\2\2\u0185\u0187\5<\37\2\u0186\u0184") + buf.write("\3\2\2\2\u0187\u018a\3\2\2\2\u0188\u0186\3\2\2\2\u0188") + buf.write("\u0189\3\2\2\2\u0189\u018b\3\2\2\2\u018a\u0188\3\2\2\2") + buf.write("\u018b\u018c\7A\2\2\u018c\u0191\3\2\2\2\u018d\u018e\5") + buf.write("> \2\u018e\u018f\7A\2\2\u018f\u0191\3\2\2\2\u0190\u0182") + buf.write("\3\2\2\2\u0190\u018d\3\2\2\2\u0191;\3\2\2\2\u0192\u0193") + buf.write("\7\65\2\2\u0193\u0194\78\2\2\u0194\u0195\5@!\2\u0195=") + buf.write("\3\2\2\2\u0196\u0197\t\6\2\2\u0197?\3\2\2\2\u0198\u019f") + buf.write("\7\65\2\2\u0199\u019f\7\66\2\2\u019a\u019f\7\67\2\2\u019b") + buf.write("\u019f\7>\2\2\u019c\u019f\5:\36\2\u019d\u019f\5B\"\2\u019e") + buf.write("\u0198\3\2\2\2\u019e\u0199\3\2\2\2\u019e\u019a\3\2\2\2") + buf.write("\u019e\u019b\3\2\2\2\u019e\u019c\3\2\2\2\u019e\u019d\3") + buf.write("\2\2\2\u019fA\3\2\2\2\u01a0\u01a1\7;\2\2\u01a1\u01a6\5") + buf.write("@!\2\u01a2\u01a3\7=\2\2\u01a3\u01a5\5@!\2\u01a4\u01a2") + buf.write("\3\2\2\2\u01a5\u01a8\3\2\2\2\u01a6\u01a4\3\2\2\2\u01a6") + buf.write("\u01a7\3\2\2\2\u01a7\u01a9\3\2\2\2\u01a8\u01a6\3\2\2\2") + buf.write("\u01a9\u01aa\7<\2\2\u01aa\u01ae\3\2\2\2\u01ab\u01ac\7") + buf.write(";\2\2\u01ac\u01ae\7<\2\2\u01ad\u01a0\3\2\2\2\u01ad\u01ab") + buf.write("\3\2\2\2\u01aeC\3\2\2\2\66GIUYbgjuy\u0083\u0087\u0091") + buf.write("\u0097\u009c\u009f\u00a2\u00a8\u00ad\u00b0\u00b3\u00bb") + buf.write("\u00be\u00c0\u00ca\u00ce\u00d7\u00e2\u00e7\u00ee\u00f4") + buf.write("\u00fe\u0103\u010a\u0113\u0119\u0121\u0129\u0130\u0133") + buf.write("\u013b\u0143\u0147\u014b\u0156\u0161\u0179\u017b\u0188") + buf.write("\u0190\u019e\u01a6\u01ad") return buf.getvalue() @@ -279,28 +280,29 @@ class PFDLParser ( Parser ): RULE_parameter = 16 RULE_struct_initialization = 17 RULE_variable_definition = 18 - RULE_primitive = 19 - RULE_attribute_access = 20 - RULE_array = 21 - RULE_number = 22 - RULE_value = 23 - RULE_expression = 24 - RULE_binOperation = 25 - RULE_unOperation = 26 - RULE_json_object = 27 - RULE_pair = 28 - RULE_json_open_bracket = 29 - RULE_json_value = 30 - RULE_json_array = 31 + RULE_variable_type = 19 + RULE_primitive = 20 + RULE_attribute_access = 21 + RULE_array = 22 + RULE_number = 23 + RULE_value = 24 + RULE_expression = 25 + RULE_binOperation = 26 + RULE_unOperation = 27 + RULE_json_object = 28 + RULE_pair = 29 + RULE_json_open_bracket = 30 + RULE_json_value = 31 + RULE_json_array = 32 ruleNames = [ "program", "struct", "task", "task_in", "task_out", "statement", "service_call", "task_call", "call_input", "call_output", "parallel", "while_loop", "counting_loop", "condition", "condition_passed", "condition_failed", "parameter", - "struct_initialization", "variable_definition", "primitive", - "attribute_access", "array", "number", "value", "expression", - "binOperation", "unOperation", "json_object", "pair", - "json_open_bracket", "json_value", "json_array" ] + "struct_initialization", "variable_definition", "variable_type", + "primitive", "attribute_access", "array", "number", "value", + "expression", "binOperation", "unOperation", "json_object", + "pair", "json_open_bracket", "json_value", "json_array" ] EOF = Token.EOF INDENT=1 @@ -369,7 +371,7 @@ class PFDLParser ( Parser ): def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.9.2") + self.checkVersion("4.9.3") self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) self._predicates = None @@ -433,33 +435,33 @@ def program(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 69 + self.state = 71 self._errHandler.sync(self) _la = self._input.LA(1) while (((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.STRUCT) | (1 << PFDLParser.TASK) | (1 << PFDLParser.NL))) != 0): - self.state = 67 + self.state = 69 self._errHandler.sync(self) token = self._input.LA(1) if token in [PFDLParser.NL]: - self.state = 64 + self.state = 66 self.match(PFDLParser.NL) pass elif token in [PFDLParser.STRUCT]: - self.state = 65 + self.state = 67 self.struct() pass elif token in [PFDLParser.TASK]: - self.state = 66 + self.state = 68 self.task() pass else: raise NoViableAltException(self) - self.state = 71 + self.state = 73 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 72 + self.state = 74 self.match(PFDLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -532,39 +534,39 @@ def struct(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 74 + self.state = 76 self.match(PFDLParser.STRUCT) - self.state = 75 + self.state = 77 self.match(PFDLParser.STARTS_WITH_UPPER_C_STR) - self.state = 76 + self.state = 78 self.match(PFDLParser.INDENT) - self.state = 83 + self.state = 85 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 77 + self.state = 79 self.variable_definition() - self.state = 79 + self.state = 81 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 78 + self.state = 80 self.match(PFDLParser.NL) - self.state = 81 + self.state = 83 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): break - self.state = 85 + self.state = 87 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.STARTS_WITH_LOWER_C_STR): break - self.state = 87 + self.state = 89 self.match(PFDLParser.DEDENT) - self.state = 88 + self.state = 90 self.match(PFDLParser.END) except RecognitionException as re: localctx.exception = re @@ -639,43 +641,43 @@ def task(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 90 + self.state = 92 self.match(PFDLParser.TASK) - self.state = 91 + self.state = 93 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 92 - self.match(PFDLParser.INDENT) self.state = 94 + self.match(PFDLParser.INDENT) + self.state = 96 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.IN: - self.state = 93 + self.state = 95 self.task_in() - self.state = 97 + self.state = 99 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 96 + self.state = 98 self.statement() - self.state = 99 + self.state = 101 self._errHandler.sync(self) _la = self._input.LA(1) if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.LOOP) | (1 << PFDLParser.PARALLEL) | (1 << PFDLParser.CONDITION) | (1 << PFDLParser.STARTS_WITH_LOWER_C_STR) | (1 << PFDLParser.STARTS_WITH_UPPER_C_STR))) != 0)): break - self.state = 102 + self.state = 104 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.OUT: - self.state = 101 + self.state = 103 self.task_out() - self.state = 104 + self.state = 106 self.match(PFDLParser.DEDENT) - self.state = 105 + self.state = 107 self.match(PFDLParser.END) except RecognitionException as re: localctx.exception = re @@ -742,35 +744,35 @@ def task_in(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 107 + self.state = 109 self.match(PFDLParser.IN) - self.state = 108 + self.state = 110 self.match(PFDLParser.INDENT) - self.state = 115 + self.state = 117 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 109 + self.state = 111 self.variable_definition() - self.state = 111 + self.state = 113 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 110 + self.state = 112 self.match(PFDLParser.NL) - self.state = 113 + self.state = 115 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): break - self.state = 117 + self.state = 119 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.STARTS_WITH_LOWER_C_STR): break - self.state = 119 + self.state = 121 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -836,35 +838,35 @@ def task_out(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 121 + self.state = 123 self.match(PFDLParser.OUT) - self.state = 122 + self.state = 124 self.match(PFDLParser.INDENT) - self.state = 129 + self.state = 131 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 123 + self.state = 125 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 125 + self.state = 127 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 124 + self.state = 126 self.match(PFDLParser.NL) - self.state = 127 + self.state = 129 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): break - self.state = 131 + self.state = 133 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.STARTS_WITH_LOWER_C_STR): break - self.state = 133 + self.state = 135 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -931,42 +933,42 @@ def statement(self): localctx = PFDLParser.StatementContext(self, self._ctx, self.state) self.enterRule(localctx, 10, self.RULE_statement) try: - self.state = 141 + self.state = 143 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,11,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 135 + self.state = 137 self.service_call() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 136 + self.state = 138 self.task_call() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 137 + self.state = 139 self.parallel() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 138 + self.state = 140 self.while_loop() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 139 + self.state = 141 self.counting_loop() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 140 + self.state = 142 self.condition() pass @@ -1036,20 +1038,20 @@ def service_call(self): self.enterRule(localctx, 12, self.RULE_service_call) self._la = 0 # Token type try: - self.state = 158 + self.state = 160 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,15,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 143 + self.state = 145 self.match(PFDLParser.STARTS_WITH_UPPER_C_STR) - self.state = 145 + self.state = 147 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 144 + self.state = 146 self.match(PFDLParser.NL) - self.state = 147 + self.state = 149 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): @@ -1059,27 +1061,27 @@ def service_call(self): elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 149 + self.state = 151 self.match(PFDLParser.STARTS_WITH_UPPER_C_STR) - self.state = 150 - self.match(PFDLParser.INDENT) self.state = 152 + self.match(PFDLParser.INDENT) + self.state = 154 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.IN: - self.state = 151 + self.state = 153 self.call_input() - self.state = 155 + self.state = 157 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.OUT: - self.state = 154 + self.state = 156 self.call_output() - self.state = 157 + self.state = 159 self.match(PFDLParser.DEDENT) pass @@ -1149,20 +1151,20 @@ def task_call(self): self.enterRule(localctx, 14, self.RULE_task_call) self._la = 0 # Token type try: - self.state = 175 + self.state = 177 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,19,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 160 + self.state = 162 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 162 + self.state = 164 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 161 + self.state = 163 self.match(PFDLParser.NL) - self.state = 164 + self.state = 166 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): @@ -1172,27 +1174,27 @@ def task_call(self): elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 166 + self.state = 168 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 167 - self.match(PFDLParser.INDENT) self.state = 169 + self.match(PFDLParser.INDENT) + self.state = 171 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.IN: - self.state = 168 + self.state = 170 self.call_input() - self.state = 172 + self.state = 174 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.OUT: - self.state = 171 + self.state = 173 self.call_output() - self.state = 174 + self.state = 176 self.match(PFDLParser.DEDENT) pass @@ -1269,27 +1271,27 @@ def call_input(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 177 + self.state = 179 self.match(PFDLParser.IN) - self.state = 178 + self.state = 180 self.match(PFDLParser.INDENT) - self.state = 186 + self.state = 188 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 186 + self.state = 188 self._errHandler.sync(self) token = self._input.LA(1) if token in [PFDLParser.STARTS_WITH_LOWER_C_STR]: - self.state = 179 + self.state = 181 self.parameter() - self.state = 181 + self.state = 183 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 180 + self.state = 182 self.match(PFDLParser.NL) - self.state = 183 + self.state = 185 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): @@ -1297,19 +1299,19 @@ def call_input(self): pass elif token in [PFDLParser.STARTS_WITH_UPPER_C_STR]: - self.state = 185 + self.state = 187 self.struct_initialization() pass else: raise NoViableAltException(self) - self.state = 188 + self.state = 190 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.STARTS_WITH_LOWER_C_STR or _la==PFDLParser.STARTS_WITH_UPPER_C_STR): break - self.state = 190 + self.state = 192 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -1376,35 +1378,35 @@ def call_output(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 192 + self.state = 194 self.match(PFDLParser.OUT) - self.state = 193 + self.state = 195 self.match(PFDLParser.INDENT) - self.state = 200 + self.state = 202 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 194 + self.state = 196 self.variable_definition() - self.state = 196 + self.state = 198 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 195 + self.state = 197 self.match(PFDLParser.NL) - self.state = 198 + self.state = 200 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): break - self.state = 202 + self.state = 204 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.STARTS_WITH_LOWER_C_STR): break - self.state = 204 + self.state = 206 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -1465,23 +1467,23 @@ def parallel(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 206 + self.state = 208 self.match(PFDLParser.PARALLEL) - self.state = 207 + self.state = 209 self.match(PFDLParser.INDENT) - self.state = 209 + self.state = 211 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 208 + self.state = 210 self.task_call() - self.state = 211 + self.state = 213 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.STARTS_WITH_LOWER_C_STR): break - self.state = 213 + self.state = 215 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -1549,27 +1551,27 @@ def while_loop(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 215 + self.state = 217 self.match(PFDLParser.LOOP) - self.state = 216 + self.state = 218 self.match(PFDLParser.WHILE) - self.state = 217 + self.state = 219 self.expression(0) - self.state = 218 + self.state = 220 self.match(PFDLParser.INDENT) - self.state = 220 + self.state = 222 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 219 + self.state = 221 self.statement() - self.state = 222 + self.state = 224 self._errHandler.sync(self) _la = self._input.LA(1) if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.LOOP) | (1 << PFDLParser.PARALLEL) | (1 << PFDLParser.CONDITION) | (1 << PFDLParser.STARTS_WITH_LOWER_C_STR) | (1 << PFDLParser.STARTS_WITH_UPPER_C_STR))) != 0)): break - self.state = 224 + self.state = 226 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -1646,49 +1648,49 @@ def counting_loop(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 227 + self.state = 229 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.PARALLEL: - self.state = 226 + self.state = 228 self.match(PFDLParser.PARALLEL) - self.state = 229 + self.state = 231 self.match(PFDLParser.LOOP) - self.state = 230 + self.state = 232 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 231 + self.state = 233 self.match(PFDLParser.TO) - self.state = 234 + self.state = 236 self._errHandler.sync(self) token = self._input.LA(1) if token in [PFDLParser.STARTS_WITH_LOWER_C_STR]: - self.state = 232 + self.state = 234 self.attribute_access() pass elif token in [PFDLParser.INTEGER]: - self.state = 233 + self.state = 235 self.match(PFDLParser.INTEGER) pass else: raise NoViableAltException(self) - self.state = 236 + self.state = 238 self.match(PFDLParser.INDENT) - self.state = 238 + self.state = 240 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 237 + self.state = 239 self.statement() - self.state = 240 + self.state = 242 self._errHandler.sync(self) _la = self._input.LA(1) if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.LOOP) | (1 << PFDLParser.PARALLEL) | (1 << PFDLParser.CONDITION) | (1 << PFDLParser.STARTS_WITH_LOWER_C_STR) | (1 << PFDLParser.STARTS_WITH_UPPER_C_STR))) != 0)): break - self.state = 242 + self.state = 244 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -1760,33 +1762,33 @@ def condition(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 244 + self.state = 246 self.match(PFDLParser.CONDITION) - self.state = 245 + self.state = 247 self.match(PFDLParser.INDENT) - self.state = 246 + self.state = 248 self.expression(0) - self.state = 248 + self.state = 250 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 247 + self.state = 249 self.match(PFDLParser.NL) - self.state = 250 + self.state = 252 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): break - self.state = 252 + self.state = 254 self.match(PFDLParser.DEDENT) - self.state = 253 - self.condition_passed() self.state = 255 + self.condition_passed() + self.state = 257 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.FAILED: - self.state = 254 + self.state = 256 self.condition_failed() @@ -1849,23 +1851,23 @@ def condition_passed(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 257 + self.state = 259 self.match(PFDLParser.PASSED) - self.state = 258 + self.state = 260 self.match(PFDLParser.INDENT) - self.state = 260 + self.state = 262 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 259 + self.state = 261 self.statement() - self.state = 262 + self.state = 264 self._errHandler.sync(self) _la = self._input.LA(1) if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.LOOP) | (1 << PFDLParser.PARALLEL) | (1 << PFDLParser.CONDITION) | (1 << PFDLParser.STARTS_WITH_LOWER_C_STR) | (1 << PFDLParser.STARTS_WITH_UPPER_C_STR))) != 0)): break - self.state = 264 + self.state = 266 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -1926,23 +1928,23 @@ def condition_failed(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 266 + self.state = 268 self.match(PFDLParser.FAILED) - self.state = 267 + self.state = 269 self.match(PFDLParser.INDENT) - self.state = 269 + self.state = 271 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 268 + self.state = 270 self.statement() - self.state = 271 + self.state = 273 self._errHandler.sync(self) _la = self._input.LA(1) if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.LOOP) | (1 << PFDLParser.PARALLEL) | (1 << PFDLParser.CONDITION) | (1 << PFDLParser.STARTS_WITH_LOWER_C_STR) | (1 << PFDLParser.STARTS_WITH_UPPER_C_STR))) != 0)): break - self.state = 273 + self.state = 275 self.match(PFDLParser.DEDENT) except RecognitionException as re: localctx.exception = re @@ -1992,18 +1994,18 @@ def parameter(self): localctx = PFDLParser.ParameterContext(self, self._ctx, self.state) self.enterRule(localctx, 32, self.RULE_parameter) try: - self.state = 277 + self.state = 279 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,34,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 275 + self.state = 277 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 276 + self.state = 278 self.attribute_access() pass @@ -2069,56 +2071,56 @@ def struct_initialization(self): self.enterRule(localctx, 34, self.RULE_struct_initialization) self._la = 0 # Token type try: - self.state = 303 + self.state = 305 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,38,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 279 + self.state = 281 self.match(PFDLParser.STARTS_WITH_UPPER_C_STR) - self.state = 280 + self.state = 282 self.match(PFDLParser.INDENT) - self.state = 281 + self.state = 283 self.json_object() - self.state = 283 + self.state = 285 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 282 + self.state = 284 self.match(PFDLParser.NL) - self.state = 285 + self.state = 287 self._errHandler.sync(self) _la = self._input.LA(1) if not (_la==PFDLParser.NL): break - self.state = 287 + self.state = 289 self.match(PFDLParser.DEDENT) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 289 + self.state = 291 self.match(PFDLParser.STARTS_WITH_UPPER_C_STR) - self.state = 293 + self.state = 295 self._errHandler.sync(self) _la = self._input.LA(1) while _la==PFDLParser.NL: - self.state = 290 + self.state = 292 self.match(PFDLParser.NL) - self.state = 295 + self.state = 297 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 296 + self.state = 298 self.json_object() - self.state = 300 + self.state = 302 self._errHandler.sync(self) _la = self._input.LA(1) while _la==PFDLParser.NL: - self.state = 297 + self.state = 299 self.match(PFDLParser.NL) - self.state = 302 + self.state = 304 self._errHandler.sync(self) _la = self._input.LA(1) @@ -2147,12 +2149,8 @@ def STARTS_WITH_LOWER_C_STR(self): def COLON(self): return self.getToken(PFDLParser.COLON, 0) - def primitive(self): - return self.getTypedRuleContext(PFDLParser.PrimitiveContext,0) - - - def array(self): - return self.getTypedRuleContext(PFDLParser.ArrayContext,0) + def variable_type(self): + return self.getTypedRuleContext(PFDLParser.Variable_typeContext,0) def getRuleIndex(self): @@ -2179,20 +2177,72 @@ def variable_definition(self): localctx = PFDLParser.Variable_definitionContext(self, self._ctx, self.state) self.enterRule(localctx, 36, self.RULE_variable_definition) - self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 305 + self.state = 307 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 306 + self.state = 308 self.match(PFDLParser.COLON) - self.state = 307 - self.primitive() self.state = 309 + self.variable_type() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class Variable_typeContext(ParserRuleContext): + __slots__ = 'parser' + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def primitive(self): + return self.getTypedRuleContext(PFDLParser.PrimitiveContext,0) + + + def array(self): + return self.getTypedRuleContext(PFDLParser.ArrayContext,0) + + + def getRuleIndex(self): + return PFDLParser.RULE_variable_type + + def enterRule(self, listener:ParseTreeListener): + if hasattr( listener, "enterVariable_type" ): + listener.enterVariable_type(self) + + def exitRule(self, listener:ParseTreeListener): + if hasattr( listener, "exitVariable_type" ): + listener.exitVariable_type(self) + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitVariable_type" ): + return visitor.visitVariable_type(self) + else: + return visitor.visitChildren(self) + + + + + def variable_type(self): + + localctx = PFDLParser.Variable_typeContext(self, self._ctx, self.state) + self.enterRule(localctx, 38, self.RULE_variable_type) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 311 + self.primitive() + self.state = 313 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.ARRAY_LEFT: - self.state = 308 + self.state = 312 self.array() @@ -2247,11 +2297,11 @@ def accept(self, visitor:ParseTreeVisitor): def primitive(self): localctx = PFDLParser.PrimitiveContext(self, self._ctx, self.state) - self.enterRule(localctx, 38, self.RULE_primitive) + self.enterRule(localctx, 40, self.RULE_primitive) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 311 + self.state = 315 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.NUMBER_P) | (1 << PFDLParser.STRING_P) | (1 << PFDLParser.BOOLEAN_P) | (1 << PFDLParser.STARTS_WITH_UPPER_C_STR))) != 0)): self._errHandler.recoverInline(self) @@ -2316,32 +2366,32 @@ def accept(self, visitor:ParseTreeVisitor): def attribute_access(self): localctx = PFDLParser.Attribute_accessContext(self, self._ctx, self.state) - self.enterRule(localctx, 40, self.RULE_attribute_access) + self.enterRule(localctx, 42, self.RULE_attribute_access) try: self.enterOuterAlt(localctx, 1) - self.state = 313 + self.state = 317 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 319 + self.state = 323 self._errHandler.sync(self) _alt = 1 while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt == 1: - self.state = 314 + self.state = 318 self.match(PFDLParser.DOT) - self.state = 315 + self.state = 319 self.match(PFDLParser.STARTS_WITH_LOWER_C_STR) - self.state = 317 + self.state = 321 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,40,self._ctx) if la_ == 1: - self.state = 316 + self.state = 320 self.array() else: raise NoViableAltException(self) - self.state = 321 + self.state = 325 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,41,self._ctx) @@ -2396,17 +2446,17 @@ def accept(self, visitor:ParseTreeVisitor): def array(self): localctx = PFDLParser.ArrayContext(self, self._ctx, self.state) - self.enterRule(localctx, 42, self.RULE_array) + self.enterRule(localctx, 44, self.RULE_array) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 323 + self.state = 327 self.match(PFDLParser.ARRAY_LEFT) - self.state = 325 + self.state = 329 self._errHandler.sync(self) _la = self._input.LA(1) if _la==PFDLParser.INTEGER or _la==PFDLParser.STARTS_WITH_LOWER_C_STR: - self.state = 324 + self.state = 328 _la = self._input.LA(1) if not(_la==PFDLParser.INTEGER or _la==PFDLParser.STARTS_WITH_LOWER_C_STR): self._errHandler.recoverInline(self) @@ -2415,7 +2465,7 @@ def array(self): self.consume() - self.state = 327 + self.state = 331 self.match(PFDLParser.ARRAY_RIGHT) except RecognitionException as re: localctx.exception = re @@ -2462,11 +2512,11 @@ def accept(self, visitor:ParseTreeVisitor): def number(self): localctx = PFDLParser.NumberContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_number) + self.enterRule(localctx, 46, self.RULE_number) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 329 + self.state = 333 _la = self._input.LA(1) if not(_la==PFDLParser.INTEGER or _la==PFDLParser.FLOAT): self._errHandler.recoverInline(self) @@ -2529,34 +2579,34 @@ def accept(self, visitor:ParseTreeVisitor): def value(self): localctx = PFDLParser.ValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_value) + self.enterRule(localctx, 48, self.RULE_value) try: - self.state = 336 + self.state = 340 self._errHandler.sync(self) token = self._input.LA(1) if token in [PFDLParser.TRUE]: self.enterOuterAlt(localctx, 1) - self.state = 331 + self.state = 335 self.match(PFDLParser.TRUE) pass elif token in [PFDLParser.FALSE]: self.enterOuterAlt(localctx, 2) - self.state = 332 + self.state = 336 self.match(PFDLParser.FALSE) pass elif token in [PFDLParser.INTEGER, PFDLParser.FLOAT]: self.enterOuterAlt(localctx, 3) - self.state = 333 + self.state = 337 self.number() pass elif token in [PFDLParser.STRING]: self.enterOuterAlt(localctx, 4) - self.state = 334 + self.state = 338 self.match(PFDLParser.STRING) pass elif token in [PFDLParser.STARTS_WITH_LOWER_C_STR]: self.enterOuterAlt(localctx, 5) - self.state = 335 + self.state = 339 self.attribute_access() pass else: @@ -2645,36 +2695,36 @@ def expression(self, _p:int=0): _parentState = self.state localctx = PFDLParser.ExpressionContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 48 - self.enterRecursionRule(localctx, 48, self.RULE_expression, _p) + _startState = 50 + self.enterRecursionRule(localctx, 50, self.RULE_expression, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 347 + self.state = 351 self._errHandler.sync(self) token = self._input.LA(1) if token in [PFDLParser.LEFT_PARENTHESIS]: - self.state = 339 + self.state = 343 self.match(PFDLParser.LEFT_PARENTHESIS) - self.state = 340 + self.state = 344 self.expression(0) - self.state = 341 + self.state = 345 self.match(PFDLParser.RIGHT_PARENTHESIS) pass elif token in [PFDLParser.BOOLEAN_NOT]: - self.state = 343 + self.state = 347 self.unOperation() - self.state = 344 + self.state = 348 self.expression(4) pass elif token in [PFDLParser.TRUE, PFDLParser.FALSE, PFDLParser.INTEGER, PFDLParser.FLOAT, PFDLParser.STRING, PFDLParser.STARTS_WITH_LOWER_C_STR]: - self.state = 346 + self.state = 350 self.value() pass else: raise NoViableAltException(self) self._ctx.stop = self._input.LT(-1) - self.state = 373 + self.state = 377 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,46,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: @@ -2682,102 +2732,102 @@ def expression(self, _p:int=0): if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 371 + self.state = 375 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,45,self._ctx) if la_ == 1: localctx = PFDLParser.ExpressionContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) - self.state = 349 + self.state = 353 if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 350 + self.state = 354 self.match(PFDLParser.STAR) - self.state = 351 + self.state = 355 self.expression(10) pass elif la_ == 2: localctx = PFDLParser.ExpressionContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) - self.state = 352 + self.state = 356 if not self.precpred(self._ctx, 8): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 8)") - self.state = 353 + self.state = 357 self.match(PFDLParser.SLASH) - self.state = 354 + self.state = 358 self.expression(9) pass elif la_ == 3: localctx = PFDLParser.ExpressionContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) - self.state = 355 + self.state = 359 if not self.precpred(self._ctx, 7): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 7)") - self.state = 356 + self.state = 360 self.match(PFDLParser.MINUS) - self.state = 357 + self.state = 361 self.expression(8) pass elif la_ == 4: localctx = PFDLParser.ExpressionContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) - self.state = 358 + self.state = 362 if not self.precpred(self._ctx, 6): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 6)") - self.state = 359 + self.state = 363 self.match(PFDLParser.PLUS) - self.state = 360 + self.state = 364 self.expression(7) pass elif la_ == 5: localctx = PFDLParser.ExpressionContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) - self.state = 361 + self.state = 365 if not self.precpred(self._ctx, 5): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 5)") - self.state = 362 + self.state = 366 self.binOperation() - self.state = 363 + self.state = 367 self.expression(6) pass elif la_ == 6: localctx = PFDLParser.ExpressionContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) - self.state = 365 + self.state = 369 if not self.precpred(self._ctx, 3): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") - self.state = 366 + self.state = 370 self.match(PFDLParser.BOOLEAN_AND) - self.state = 367 + self.state = 371 self.expression(4) pass elif la_ == 7: localctx = PFDLParser.ExpressionContext(self, _parentctx, _parentState) self.pushNewRecursionContext(localctx, _startState, self.RULE_expression) - self.state = 368 + self.state = 372 if not self.precpred(self._ctx, 2): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 2)") - self.state = 369 + self.state = 373 self.match(PFDLParser.BOOLEAN_OR) - self.state = 370 + self.state = 374 self.expression(3) pass - self.state = 375 + self.state = 379 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,46,self._ctx) @@ -2838,11 +2888,11 @@ def accept(self, visitor:ParseTreeVisitor): def binOperation(self): localctx = PFDLParser.BinOperationContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_binOperation) + self.enterRule(localctx, 52, self.RULE_binOperation) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 376 + self.state = 380 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << PFDLParser.LESS_THAN) | (1 << PFDLParser.LESS_THAN_OR_EQUAL) | (1 << PFDLParser.GREATER_THAN) | (1 << PFDLParser.GREATER_THAN_OR_EQUAL) | (1 << PFDLParser.EQUAL) | (1 << PFDLParser.NOT_EQUAL))) != 0)): self._errHandler.recoverInline(self) @@ -2891,10 +2941,10 @@ def accept(self, visitor:ParseTreeVisitor): def unOperation(self): localctx = PFDLParser.UnOperationContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_unOperation) + self.enterRule(localctx, 54, self.RULE_unOperation) try: self.enterOuterAlt(localctx, 1) - self.state = 378 + self.state = 382 self.match(PFDLParser.BOOLEAN_NOT) except RecognitionException as re: localctx.exception = re @@ -2955,39 +3005,39 @@ def accept(self, visitor:ParseTreeVisitor): def json_object(self): localctx = PFDLParser.Json_objectContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_json_object) + self.enterRule(localctx, 56, self.RULE_json_object) self._la = 0 # Token type try: - self.state = 394 + self.state = 398 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,48,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 380 + self.state = 384 self.json_open_bracket() - self.state = 381 + self.state = 385 self.pair() - self.state = 386 + self.state = 390 self._errHandler.sync(self) _la = self._input.LA(1) while _la==PFDLParser.JSON_COMMA: - self.state = 382 + self.state = 386 self.match(PFDLParser.JSON_COMMA) - self.state = 383 + self.state = 387 self.pair() - self.state = 388 + self.state = 392 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 389 + self.state = 393 self.match(PFDLParser.JSON_CLOSE) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 391 + self.state = 395 self.json_open_bracket() - self.state = 392 + self.state = 396 self.match(PFDLParser.JSON_CLOSE) pass @@ -3041,14 +3091,14 @@ def accept(self, visitor:ParseTreeVisitor): def pair(self): localctx = PFDLParser.PairContext(self, self._ctx, self.state) - self.enterRule(localctx, 56, self.RULE_pair) + self.enterRule(localctx, 58, self.RULE_pair) try: self.enterOuterAlt(localctx, 1) - self.state = 396 + self.state = 400 self.match(PFDLParser.JSON_STRING) - self.state = 397 + self.state = 401 self.match(PFDLParser.JSON_COLON) - self.state = 398 + self.state = 402 self.json_value() except RecognitionException as re: localctx.exception = re @@ -3095,11 +3145,11 @@ def accept(self, visitor:ParseTreeVisitor): def json_open_bracket(self): localctx = PFDLParser.Json_open_bracketContext(self, self._ctx, self.state) - self.enterRule(localctx, 58, self.RULE_json_open_bracket) + self.enterRule(localctx, 60, self.RULE_json_open_bracket) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 400 + self.state = 404 _la = self._input.LA(1) if not(_la==PFDLParser.JSON_OPEN or _la==PFDLParser.JSON_OPEN_2): self._errHandler.recoverInline(self) @@ -3165,39 +3215,39 @@ def accept(self, visitor:ParseTreeVisitor): def json_value(self): localctx = PFDLParser.Json_valueContext(self, self._ctx, self.state) - self.enterRule(localctx, 60, self.RULE_json_value) + self.enterRule(localctx, 62, self.RULE_json_value) try: - self.state = 408 + self.state = 412 self._errHandler.sync(self) token = self._input.LA(1) if token in [PFDLParser.JSON_STRING]: self.enterOuterAlt(localctx, 1) - self.state = 402 + self.state = 406 self.match(PFDLParser.JSON_STRING) pass elif token in [PFDLParser.JSON_TRUE]: self.enterOuterAlt(localctx, 2) - self.state = 403 + self.state = 407 self.match(PFDLParser.JSON_TRUE) pass elif token in [PFDLParser.JSON_FALSE]: self.enterOuterAlt(localctx, 3) - self.state = 404 + self.state = 408 self.match(PFDLParser.JSON_FALSE) pass elif token in [PFDLParser.NUMBER]: self.enterOuterAlt(localctx, 4) - self.state = 405 + self.state = 409 self.match(PFDLParser.NUMBER) pass elif token in [PFDLParser.JSON_OPEN, PFDLParser.JSON_OPEN_2]: self.enterOuterAlt(localctx, 5) - self.state = 406 + self.state = 410 self.json_object() pass elif token in [PFDLParser.JSON_ARRAY_LEFT]: self.enterOuterAlt(localctx, 6) - self.state = 407 + self.state = 411 self.json_array() pass else: @@ -3261,39 +3311,39 @@ def accept(self, visitor:ParseTreeVisitor): def json_array(self): localctx = PFDLParser.Json_arrayContext(self, self._ctx, self.state) - self.enterRule(localctx, 62, self.RULE_json_array) + self.enterRule(localctx, 64, self.RULE_json_array) self._la = 0 # Token type try: - self.state = 423 + self.state = 427 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,51,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 410 + self.state = 414 self.match(PFDLParser.JSON_ARRAY_LEFT) - self.state = 411 + self.state = 415 self.json_value() - self.state = 416 + self.state = 420 self._errHandler.sync(self) _la = self._input.LA(1) while _la==PFDLParser.JSON_COMMA: - self.state = 412 + self.state = 416 self.match(PFDLParser.JSON_COMMA) - self.state = 413 + self.state = 417 self.json_value() - self.state = 418 + self.state = 422 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 419 + self.state = 423 self.match(PFDLParser.JSON_ARRAY_RIGHT) pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 421 + self.state = 425 self.match(PFDLParser.JSON_ARRAY_LEFT) - self.state = 422 + self.state = 426 self.match(PFDLParser.JSON_ARRAY_RIGHT) pass @@ -3311,7 +3361,7 @@ def json_array(self): def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): if self._predicates == None: self._predicates = dict() - self._predicates[24] = self.expression_sempred + self._predicates[25] = self.expression_sempred pred = self._predicates.get(ruleIndex, None) if pred is None: raise Exception("No predicate with index:" + str(ruleIndex)) diff --git a/pfdl_scheduler/parser/PFDLParserVisitor.py b/pfdl_scheduler/parser/PFDLParserVisitor.py index 5549436..321dc46 100644 --- a/pfdl_scheduler/parser/PFDLParserVisitor.py +++ b/pfdl_scheduler/parser/PFDLParserVisitor.py @@ -1,4 +1,4 @@ -# Generated from PFDLParser.g4 by ANTLR 4.9.2 +# Generated from PFDLParser.g4 by ANTLR 4.9.3 from antlr4 import * if __name__ is not None and "." in __name__: from .PFDLParser import PFDLParser @@ -104,6 +104,11 @@ def visitVariable_definition(self, ctx:PFDLParser.Variable_definitionContext): return self.visitChildren(ctx) + # Visit a parse tree produced by PFDLParser#variable_type. + def visitVariable_type(self, ctx:PFDLParser.Variable_typeContext): + return self.visitChildren(ctx) + + # Visit a parse tree produced by PFDLParser#primitive. def visitPrimitive(self, ctx:PFDLParser.PrimitiveContext): return self.visitChildren(ctx) diff --git a/pfdl_scheduler/parser/pfdl_tree_visitor.py b/pfdl_scheduler/parser/pfdl_tree_visitor.py index a27ad46..b9ff2ef 100644 --- a/pfdl_scheduler/parser/pfdl_tree_visitor.py +++ b/pfdl_scheduler/parser/pfdl_tree_visitor.py @@ -309,14 +309,18 @@ def visitVariable_definition( self, ctx: PFDLParser.Variable_definitionContext ) -> Tuple[str, Union[str, Array]]: identifier = ctx.STARTS_WITH_LOWER_C_STR().getText() + variable_type = self.visitVariable_type(ctx.variable_type()) + return (identifier, variable_type) + + def visitVariable_type(self, ctx: PFDLParser.Variable_typeContext) -> Union[str, Array]: variable_type = self.visitPrimitive(ctx.primitive()) if ctx.array(): array = self.initializeArray(ctx.array(), variable_type) variable_type = array - return (identifier, variable_type) + return variable_type def visitPrimitive(self, ctx: PFDLParser.PrimitiveContext): return ctx.getText() diff --git a/tests/unit_test/test_pfdl_tree_visitor.py b/tests/unit_test/test_pfdl_tree_visitor.py index 935dc2d..f3e2205 100644 --- a/tests/unit_test/test_pfdl_tree_visitor.py +++ b/tests/unit_test/test_pfdl_tree_visitor.py @@ -56,7 +56,7 @@ def setUp(self) -> None: self.visitor: PFDLTreeVisitor = PFDLTreeVisitor(self.error_handler) def check_if_print_error_is_called(self, method, *args) -> None: - """Runs the given method wiht the help of a mock object and checks if print error is called. + """Runs the given method with the help of a mock object and checks if print error is called. Args: method: The method which should be tested. @@ -560,16 +560,16 @@ def test_visitCountingLoop(self): create_and_add_token(PFDLParser.STARTS_WITH_LOWER_C_STR, "i", counting_loop_context) create_and_add_token(PFDLParser.INTEGER, "5", counting_loop_context) with patch.object( - self.visitor, "visitStatement", MagicMock(side_effect=[service, condition]) - ) as mock_2: - counting_loop = self.visitor.visitCounting_loop(counting_loop_context) - self.assertEqual(counting_loop.counting_variable, "i") - self.assertEqual(counting_loop.limit, 5) - self.assertFalse(counting_loop.parallel) - self.assertEqual(len(counting_loop.statements), 2) - self.assertEqual(counting_loop.statements[0], service) - self.assertEqual(counting_loop.statements[1], condition) - self.assertEqual(counting_loop.context, counting_loop_context) + self.visitor, "visitStatement", MagicMock(side_effect=[service, condition]) + ) as mock_2: + counting_loop = self.visitor.visitCounting_loop(counting_loop_context) + self.assertEqual(counting_loop.counting_variable, "i") + self.assertEqual(counting_loop.limit, 5) + self.assertFalse(counting_loop.parallel) + self.assertEqual(len(counting_loop.statements), 2) + self.assertEqual(counting_loop.statements[0], service) + self.assertEqual(counting_loop.statements[1], condition) + self.assertEqual(counting_loop.context, counting_loop_context) mock_2.assert_called_with(statement_context_2) def test_visitCondition(self): @@ -671,51 +671,77 @@ def test_visitVariable_definition(self): variable_definition_context = PFDLParser.Variable_definitionContext(None) # without array variable_definition_context.children = [ - PFDLParser.PrimitiveContext(None), + PFDLParser.Variable_typeContext(None), ] create_and_add_token( PFDLParser.STARTS_WITH_LOWER_C_STR, "variable", variable_definition_context ) - with patch.object(self.visitor, "visitPrimitive", return_value="number"): + with patch.object(self.visitor, "visitVariable_type", return_value="number"): self.assertEqual( self.visitor.visitVariable_definition(variable_definition_context), ("variable", "number"), ) + def test_visitVariable_type(self): + variable_type_context = PFDLParser.Variable_typeContext(None) + + # without array + variable_type_context.children = [ + PFDLParser.PrimitiveContext(None), + ] + with patch.object(self.visitor, "visitPrimitive", return_value="string"): + with patch.object(self.visitor, "initializeArray", return_value=-1) as mock: + self.assertEqual(self.visitor.visitVariable_type(variable_type_context), "string") + + # no array to initialize + mock.assert_not_called() + # with array - variable_definition_context.children = [ + array_context = PFDLParser.ArrayContext(None) + variable_type_context.children = [ PFDLParser.PrimitiveContext(None), - PFDLParser.ArrayContext(None), + array_context, ] - create_and_add_token( - PFDLParser.STARTS_WITH_LOWER_C_STR, "variable", variable_definition_context - ) with patch.object(self.visitor, "visitPrimitive", return_value="string"): - # without length - with patch.object(self.visitor, "visitArray", return_value=-1): - self.assertEqual( - self.visitor.visitVariable_definition(variable_definition_context), - ("variable", Array("string")), - ) - # with length - with patch.object(self.visitor, "visitArray", return_value=10): - array = Array("string") - array.length = 10 - self.assertEqual( - self.visitor.visitVariable_definition(variable_definition_context), - ("variable", array), - ) - # with invalid length (string) - with patch.object(self.visitor, "visitArray", return_value="not a number"): + with patch.object( + self.visitor, "initializeArray", return_value=Array("string") + ) as mock: self.assertEqual( - self.visitor.visitVariable_definition(variable_definition_context), - ("variable", Array("string")), - ) - self.check_if_print_error_is_called( - self.visitor.visitVariable_definition, variable_definition_context + self.visitor.visitVariable_type(variable_type_context), Array("string") ) + mock.assert_called_with(array_context, "string") + + def test_initializeArray(self): + array_context = PFDLParser.ArrayContext(None) + variable_type = "string" + + # without length + with patch.object(self.visitor, "visitArray", return_value=-1): + array = Array("string") + array.length = 10 + self.assertEqual( + self.visitor.initializeArray(array_context, variable_type), Array("string") + ) + + # with length + with patch.object(self.visitor, "visitArray", return_value=10): + expected_array = Array("string") + expected_array.length = 10 + self.assertEqual( + self.visitor.initializeArray(array_context, variable_type), expected_array + ) + + # with invalid length (string) + with patch.object(self.visitor, "visitArray", return_value="not a number"): + self.assertEqual( + self.visitor.initializeArray(array_context, variable_type), Array("string") + ) + self.check_if_print_error_is_called( + self.visitor.initializeArray, array_context, variable_type + ) + def test_visitPrimitive(self): primitive_context = PFDLParser.PrimitiveContext(None) create_and_add_token(PFDLParser.NUMBER_P, "number", primitive_context)