From 39623bc728248594fa3f922be0b5beaa777581ca Mon Sep 17 00:00:00 2001 From: bryankenote Date: Wed, 10 Jan 2024 11:58:39 -0800 Subject: [PATCH 01/11] add optional semicolon to cfg --- src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 709d7a3..2454b01 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -42,7 +42,7 @@ definition ::= (attribute_list* service_spec) markdown_remarks* -service_spec ::= service identifier service_items { pin=1 } +service_spec ::= (service identifier service_items[';']) { pin=1 } service_items ::= ('{' decorated_service_item* '}') | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } From 6124850d44d8e2335fe66d3085a0ac17fabba9f2 Mon Sep 17 00:00:00 2001 From: bryankenote Date: Tue, 31 Dec 2024 14:43:31 -0800 Subject: [PATCH 02/11] update bnf and codegen --- .../intellij/parser/FsdParser.java | 27 +- .../intellij/parser/FsdParserUtil.java | 6 + .../io/github/facilityapi/intellij/fsd.bnf | 5 +- .../facilityapi/intellij/lexer/_FsdLexer.flex | 444 ++---------------- 4 files changed, 84 insertions(+), 398 deletions(-) create mode 100644 src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index 2e2d4ae..e00c885 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -4,7 +4,7 @@ import com.intellij.lang.PsiBuilder; import com.intellij.lang.PsiBuilder.Marker; import static io.github.facilityapi.intellij.psi.FsdTypes.*; -import static com.intellij.lang.parser.GeneratedParserUtilBase.*; +import static io.github.facilityapi.intellij.parser.FsdParserUtil.*; import com.intellij.psi.tree.IElementType; import com.intellij.lang.ASTNode; import com.intellij.psi.tree.TokenSet; @@ -787,12 +787,13 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | decorated_service_item + // ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; Marker m = enter_section_(b, l, _NONE_, SERVICE_ITEMS, ""); r = service_items_0(b, l + 1); + if (!r) r = service_items_1(b, l + 1); if (!r) r = decorated_service_item(b, l + 1); exit_section_(b, l, m, r, false, null); return r; @@ -821,6 +822,28 @@ private static boolean service_items_0_1(PsiBuilder b, int l) { return true; } + // ';' decorated_service_item* + private static boolean service_items_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, SEMI); + r = r && service_items_1_1(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // decorated_service_item* + private static boolean service_items_1_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_1")) return false; + while (true) { + int c = current_position_(b); + if (!decorated_service_item(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "service_items_1_1", c)) break; + } + return true; + } + /* ********************************************************** */ // service identifier service_items public static boolean service_spec(PsiBuilder b, int l) { diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java new file mode 100644 index 0000000..4aa7076 --- /dev/null +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java @@ -0,0 +1,6 @@ +package io.github.facilityapi.intellij.parser; + +import com.intellij.lang.parser.GeneratedParserUtilBase; + +public class FsdParserUtil extends GeneratedParserUtilBase { +} diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 2454b01..94a44b6 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -1,5 +1,6 @@ { parserClass="io.github.facilityapi.intellij.parser.FsdParser" + parserUtilClass="io.github.facilityapi.intellij.parser.FsdParserUtil" psiClassPrefix="Fsd" psiImplClassSuffix="Impl" @@ -42,8 +43,8 @@ definition ::= (attribute_list* service_spec) markdown_remarks* -service_spec ::= (service identifier service_items[';']) { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | decorated_service_item +service_spec ::= service identifier service_items { pin=1 } +service_items ::= ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method) diff --git a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex index bb69d2d..9dba330 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex +++ b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex @@ -11,7 +11,7 @@ import static io.github.facilityapi.intellij.psi.FsdTypes.*; %{ public _FsdLexer() { - this((java.io.Reader)null); + this((java.io.Reader)null); } %} @@ -26,405 +26,61 @@ EOL=\R WHITE_SPACE=\s+ COMMENT="//"[^\r\n]* -IDENTIFIER=[a-zA-Z0-9_]+ +SPACE=[ \t\n\x0B\f\r]+ +IDENTIFIER=[a-zA-Z_0-9]+ +TYPENAME=[a-zA-Z_0-9]+ +ATTRIBUTENAME=[a-zA-Z_0-9]+ ATTRIBUTEPARAMETERVALUE=\"(([^\"\\]+|\\[\"\\/bfnrt]|\\u[0-9a-fA-f]{4})*)\"|([0-9a-zA-Z.+_-]+) NUMBER=[0-9]+(\.[0-9]*)? -MARKDOWN_HEADING=#[^\r\n]* -MARKDOWN_TEXT=.+ - -%state MARKDOWN_SECTION -%state SERVICE_ATTRIBUTE, SERVICE_ATTRIBUTE_PARAMETER_LIST, SERVICE_ATTRIBUTE_ARGUMENT -%state SERVICE_BODY, SERVICE_BODY_ATTRIBUTE, SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST, SERVICE_BODY_ATTRIBUTE_ARGUMENT -%state METHOD_BODY, METHOD_BODY_TYPE, METHOD_BODY_TYPE_END, METHOD_BODY_ATTRIBUTE, METHOD_BODY_ATTRIBUTE_PARAMETER_LIST, METHOD_BODY_ATTRIBUTE_ARGUMENT -%state RESPONSE_SEPARATOR, RESPONSE_BODY, RESPONSE_BODY_TYPE, RESPONSE_BODY_TYPE_END, RESPONSE_BODY_ATTRIBUTE, RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST, RESPONSE_BODY_ATTRIBUTE_ARGUMENT -%state DATA_BODY, DATA_BODY_TYPE, DATA_BODY_TYPE_END, DATA_BODY_ATTRIBUTE, DATA_BODY_ATTRIBUTE_PARAMETER_LIST, DATA_BODY_ATTRIBUTE_ARGUMENT -%state LIST_BODY, LIST_BODY_ATTRIBUTE, LIST_BODY_ATTRIBUTE_PARAMETER_LIST, LIST_BODY_ATTRIBUTE_ARGUMENT -%state EXTERN_DECL +MARKDOWNHEADING=#[^\r\n]* +MARKDOWNTEXT=.+ %% { - {WHITE_SPACE} { return WHITE_SPACE; } - - "service" { yybegin(SERVICE_BODY); return SERVICE; } - - "[" { yybegin(SERVICE_ATTRIBUTE); return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - - {COMMENT} { return COMMENT; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "(" { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } - ")" { return RIGHT_PAREN; } - - {IDENTIFIER} { return ATTRIBUTENAME; } - , { return COMMA; } - ] { yybegin(YYINITIAL); return RIGHT_BRACKET; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - ")" { yybegin(SERVICE_ATTRIBUTE); return RIGHT_PAREN; } - , { return COMMA; } - - {IDENTIFIER} { yybegin(SERVICE_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - ":" { return COLON; } - {ATTRIBUTEPARAMETERVALUE} { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "extern" { yybegin(EXTERN_DECL); return EXTERN; } - "method" { yybegin(METHOD_BODY); return METHOD; } - "data" { yybegin(DATA_BODY); return DATA; } - "errors" { yybegin(LIST_BODY); return ERRORS; } - "enum" { yybegin(LIST_BODY); return ENUM; } - - "{" { return LEFT_BRACE; } - "}" { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } - "[" { yybegin(SERVICE_BODY_ATTRIBUTE); return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - - {IDENTIFIER} { return IDENTIFIER; } - {COMMENT} { return COMMENT; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "(" { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } - ")" { return RIGHT_PAREN; } - - {IDENTIFIER} { return ATTRIBUTENAME; } - , { return COMMA; } - ] { yybegin(SERVICE_BODY); return RIGHT_BRACKET; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - ")" { yybegin(SERVICE_BODY_ATTRIBUTE); return RIGHT_PAREN; } - , { return COMMA; } - - {IDENTIFIER} { yybegin(SERVICE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - ":" { return COLON; } - {ATTRIBUTEPARAMETERVALUE} { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "{" { return LEFT_BRACE; } - "}" { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } - ":" { yybegin(METHOD_BODY_TYPE); return COLON; } - "[" { yybegin(METHOD_BODY_ATTRIBUTE); return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - {COMMENT} { return COMMENT; } - {IDENTIFIER} { return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "(" { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } - ")" { return RIGHT_PAREN; } - - {IDENTIFIER} { return ATTRIBUTENAME; } - , { return COMMA; } - ] { yybegin(METHOD_BODY); return RIGHT_BRACKET; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - ")" { yybegin(METHOD_BODY_ATTRIBUTE); return RIGHT_PAREN; } - , { return COMMA; } - - {IDENTIFIER} { yybegin(METHOD_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - ":" { return COLON; } - {ATTRIBUTEPARAMETERVALUE} { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - {COMMENT} { return COMMENT; } - - "string" { yybegin(METHOD_BODY_TYPE_END); return STRING; } - "boolean" { yybegin(METHOD_BODY_TYPE_END); return BOOLEAN; } - "int32" { yybegin(METHOD_BODY_TYPE_END); return INT32; } - "int64" { yybegin(METHOD_BODY_TYPE_END); return INT64; } - "double" { yybegin(METHOD_BODY_TYPE_END); return DOUBLE; } - "decimal" { yybegin(METHOD_BODY_TYPE_END); return DECIMAL; } - "datetime" { yybegin(METHOD_BODY_TYPE_END); return DATETIME; } - "bytes" { yybegin(METHOD_BODY_TYPE_END); return BYTES; } - "object" { yybegin(METHOD_BODY_TYPE_END); return OBJECT; } - "map" { yybegin(METHOD_BODY_TYPE_END); return MAP; } - "result" { yybegin(METHOD_BODY_TYPE_END); return RESULT; } - "nullable" { yybegin(METHOD_BODY_TYPE_END); return NULLABLE; } - "error" { yybegin(METHOD_BODY_TYPE_END); return ERROR; } - - {IDENTIFIER} { yybegin(METHOD_BODY_TYPE_END); return TYPENAME; } - - "}" { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - {COMMENT} { return COMMENT; } - - "<" { yybegin(METHOD_BODY_TYPE); return LEFT_ANGLE; } - ">" { return RIGHT_ANGLE; } - "[" { return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - "!" { return BANG; } - - ";" { yybegin(METHOD_BODY); return SEMI; } - - // Identifiers shouldn't be here, so break back into the body definition - {IDENTIFIER} { yybegin(METHOD_BODY); return IDENTIFIER; } - "}" { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - {COMMENT} { return COMMENT; } - - ":" { yybegin(RESPONSE_BODY); return COLON; } - "}" { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } - - "method" { yybegin(METHOD_BODY); return METHOD; } - "data" { yybegin(DATA_BODY); return DATA; } - "errors" { yybegin(LIST_BODY); return ERRORS; } - "enum" { yybegin(LIST_BODY); return ENUM; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "{" { return LEFT_BRACE; } - "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } - ":" { yybegin(RESPONSE_BODY_TYPE); return COLON; } - "[" { yybegin(RESPONSE_BODY_ATTRIBUTE); return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - {COMMENT} { return COMMENT; } - {IDENTIFIER} { return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "(" { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } - ")" { return RIGHT_PAREN; } - - {IDENTIFIER} { return ATTRIBUTENAME; } - , { return COMMA; } - ] { yybegin(RESPONSE_BODY); return RIGHT_BRACKET; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - ")" { yybegin(RESPONSE_BODY_ATTRIBUTE); return RIGHT_PAREN; } - , { return COMMA; } - - {IDENTIFIER} { yybegin(RESPONSE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - ":" { return COLON; } - {ATTRIBUTEPARAMETERVALUE} { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - {COMMENT} { return COMMENT; } - - "string" { yybegin(RESPONSE_BODY_TYPE_END); return STRING; } - "boolean" { yybegin(RESPONSE_BODY_TYPE_END); return BOOLEAN; } - "int32" { yybegin(RESPONSE_BODY_TYPE_END); return INT32; } - "int64" { yybegin(RESPONSE_BODY_TYPE_END); return INT64; } - "double" { yybegin(RESPONSE_BODY_TYPE_END); return DOUBLE; } - "decimal" { yybegin(RESPONSE_BODY_TYPE_END); return DECIMAL; } - "datetime" { yybegin(RESPONSE_BODY_TYPE_END); return DATETIME; } - "bytes" { yybegin(RESPONSE_BODY_TYPE_END); return BYTES; } - "object" { yybegin(RESPONSE_BODY_TYPE_END); return OBJECT; } - "map" { yybegin(RESPONSE_BODY_TYPE_END); return MAP; } - "result" { yybegin(RESPONSE_BODY_TYPE_END); return RESULT; } - "nullable" { yybegin(RESPONSE_BODY_TYPE_END); return NULLABLE; } - "error" { yybegin(RESPONSE_BODY_TYPE_END); return ERROR; } - - {IDENTIFIER} { yybegin(RESPONSE_BODY_TYPE_END); return TYPENAME; } - - "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - {COMMENT} { return COMMENT; } - - "<" { yybegin(RESPONSE_BODY_TYPE); return LEFT_ANGLE; } - ">" { return RIGHT_ANGLE; } - "[" { return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - "!" { return BANG; } - - ";" { yybegin(RESPONSE_BODY); return SEMI; } - - // Identifiers shouldn't be here, so break back into the body definition - {IDENTIFIER} { yybegin(RESPONSE_BODY); return IDENTIFIER; } - "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "{" { return LEFT_BRACE; } - "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } - ":" { yybegin(DATA_BODY_TYPE); return COLON; } - "[" { yybegin(DATA_BODY_ATTRIBUTE); return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - {COMMENT} { return COMMENT; } - {IDENTIFIER} { return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "(" { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } - ")" { return RIGHT_PAREN; } - - {IDENTIFIER} { return ATTRIBUTENAME; } - , { return COMMA; } - ] { yybegin(DATA_BODY); return RIGHT_BRACKET; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - ")" { yybegin(DATA_BODY_ATTRIBUTE); return RIGHT_PAREN; } - , { return COMMA; } - - {IDENTIFIER} { yybegin(DATA_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - ":" { return COLON; } - {ATTRIBUTEPARAMETERVALUE} { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - {COMMENT} { return COMMENT; } - - "string" { yybegin(DATA_BODY_TYPE_END); return STRING; } - "boolean" { yybegin(DATA_BODY_TYPE_END); return BOOLEAN; } - "int32" { yybegin(DATA_BODY_TYPE_END); return INT32; } - "int64" { yybegin(DATA_BODY_TYPE_END); return INT64; } - "double" { yybegin(DATA_BODY_TYPE_END); return DOUBLE; } - "decimal" { yybegin(DATA_BODY_TYPE_END); return DECIMAL; } - "datetime" { yybegin(DATA_BODY_TYPE_END); return DATETIME; } - "bytes" { yybegin(DATA_BODY_TYPE_END); return BYTES; } - "object" { yybegin(DATA_BODY_TYPE_END); return OBJECT; } - "map" { yybegin(DATA_BODY_TYPE_END); return MAP; } - "result" { yybegin(DATA_BODY_TYPE_END); return RESULT; } - "nullable" { yybegin(DATA_BODY_TYPE_END); return NULLABLE; } - "error" { yybegin(DATA_BODY_TYPE_END); return ERROR; } - - {IDENTIFIER} { yybegin(DATA_BODY_TYPE_END); return TYPENAME; } - - "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - {COMMENT} { return COMMENT; } - - "<" { yybegin(DATA_BODY_TYPE); return LEFT_ANGLE; } - ">" { return RIGHT_ANGLE; } - "[" { return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - "!" { return BANG; } - - ";" { yybegin(DATA_BODY); return SEMI; } - - // Identifiers shouldn't be here, so break back into the body definition - {IDENTIFIER} { yybegin(DATA_BODY); return IDENTIFIER; } - "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "{" { return LEFT_BRACE; } - "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } - "," { return COMMA; } - "[" { yybegin(LIST_BODY_ATTRIBUTE); return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - {COMMENT} { return COMMENT; } - {IDENTIFIER} { return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "(" { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } - ")" { return RIGHT_PAREN; } - - {IDENTIFIER} { return ATTRIBUTENAME; } - , { return COMMA; } - ] { yybegin(LIST_BODY); return RIGHT_BRACKET; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - ")" { yybegin(LIST_BODY_ATTRIBUTE); return RIGHT_PAREN; } - , { return COMMA; } - - {IDENTIFIER} { yybegin(LIST_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - ":" { return COLON; } - {ATTRIBUTEPARAMETERVALUE} { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } -} - - { - {WHITE_SPACE} { return WHITE_SPACE; } - - "data" { return DATA; } - "enum" { return ENUM; } - - ";" { yybegin(SERVICE_BODY); return SEMI; } - - {COMMENT} { return COMMENT; } - {IDENTIFIER} { return IDENTIFIER; } -} + {WHITE_SPACE} { return WHITE_SPACE; } + + "(" { return LEFT_PAREN; } + ")" { return RIGHT_PAREN; } + "{" { return LEFT_BRACE; } + "}" { return RIGHT_BRACE; } + "[" { return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + "<" { return LEFT_ANGLE; } + ">" { return RIGHT_ANGLE; } + "," { return COMMA; } + ";" { return SEMI; } + ":" { return COLON; } + "!" { return BANG; } + "service" { return SERVICE; } + "extern" { return EXTERN; } + "enum" { return ENUM; } + "data" { return DATA; } + "errors" { return ERRORS; } + "method" { return METHOD; } + "string" { return STRING; } + "boolean" { return BOOLEAN; } + "int32" { return INT32; } + "int64" { return INT64; } + "double" { return DOUBLE; } + "decimal" { return DECIMAL; } + "datetime" { return DATETIME; } + "bytes" { return BYTES; } + "object" { return OBJECT; } + "map" { return MAP; } + "result" { return RESULT; } + "error" { return ERROR; } + "nullable" { return NULLABLE; } + + {COMMENT} { return COMMENT; } + {SPACE} { return SPACE; } + {IDENTIFIER} { return IDENTIFIER; } + {TYPENAME} { return TYPENAME; } + {ATTRIBUTENAME} { return ATTRIBUTENAME; } + {ATTRIBUTEPARAMETERVALUE} { return ATTRIBUTEPARAMETERVALUE; } + {NUMBER} { return NUMBER; } + {MARKDOWNHEADING} { return MARKDOWNHEADING; } + {MARKDOWNTEXT} { return MARKDOWNTEXT; } - { - \r { return WHITE_SPACE; } - \n { return WHITE_SPACE; } - {MARKDOWN_HEADING} { return MARKDOWNHEADING; } - {MARKDOWN_TEXT} { return MARKDOWNTEXT; } } [^] { return BAD_CHARACTER; } From b9e3e3f4e124e67497c3a1de9c36442fe5ee2496 Mon Sep 17 00:00:00 2001 From: bryankenote Date: Tue, 31 Dec 2024 14:53:08 -0800 Subject: [PATCH 03/11] Revert "update bnf and codegen" This reverts commit 6124850d44d8e2335fe66d3085a0ac17fabba9f2. --- .../intellij/parser/FsdParser.java | 27 +- .../intellij/parser/FsdParserUtil.java | 6 - .../io/github/facilityapi/intellij/fsd.bnf | 5 +- .../facilityapi/intellij/lexer/_FsdLexer.flex | 444 ++++++++++++++++-- 4 files changed, 398 insertions(+), 84 deletions(-) delete mode 100644 src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index e00c885..2e2d4ae 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -4,7 +4,7 @@ import com.intellij.lang.PsiBuilder; import com.intellij.lang.PsiBuilder.Marker; import static io.github.facilityapi.intellij.psi.FsdTypes.*; -import static io.github.facilityapi.intellij.parser.FsdParserUtil.*; +import static com.intellij.lang.parser.GeneratedParserUtilBase.*; import com.intellij.psi.tree.IElementType; import com.intellij.lang.ASTNode; import com.intellij.psi.tree.TokenSet; @@ -787,13 +787,12 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item + // ('{' decorated_service_item* '}') | decorated_service_item public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; Marker m = enter_section_(b, l, _NONE_, SERVICE_ITEMS, ""); r = service_items_0(b, l + 1); - if (!r) r = service_items_1(b, l + 1); if (!r) r = decorated_service_item(b, l + 1); exit_section_(b, l, m, r, false, null); return r; @@ -822,28 +821,6 @@ private static boolean service_items_0_1(PsiBuilder b, int l) { return true; } - // ';' decorated_service_item* - private static boolean service_items_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "service_items_1")) return false; - boolean r; - Marker m = enter_section_(b); - r = consumeToken(b, SEMI); - r = r && service_items_1_1(b, l + 1); - exit_section_(b, m, null, r); - return r; - } - - // decorated_service_item* - private static boolean service_items_1_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "service_items_1_1")) return false; - while (true) { - int c = current_position_(b); - if (!decorated_service_item(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "service_items_1_1", c)) break; - } - return true; - } - /* ********************************************************** */ // service identifier service_items public static boolean service_spec(PsiBuilder b, int l) { diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java deleted file mode 100644 index 4aa7076..0000000 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParserUtil.java +++ /dev/null @@ -1,6 +0,0 @@ -package io.github.facilityapi.intellij.parser; - -import com.intellij.lang.parser.GeneratedParserUtilBase; - -public class FsdParserUtil extends GeneratedParserUtilBase { -} diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 94a44b6..2454b01 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -1,6 +1,5 @@ { parserClass="io.github.facilityapi.intellij.parser.FsdParser" - parserUtilClass="io.github.facilityapi.intellij.parser.FsdParserUtil" psiClassPrefix="Fsd" psiImplClassSuffix="Impl" @@ -43,8 +42,8 @@ definition ::= (attribute_list* service_spec) markdown_remarks* -service_spec ::= service identifier service_items { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item +service_spec ::= (service identifier service_items[';']) { pin=1 } +service_items ::= ('{' decorated_service_item* '}') | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method) diff --git a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex index 9dba330..bb69d2d 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex +++ b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex @@ -11,7 +11,7 @@ import static io.github.facilityapi.intellij.psi.FsdTypes.*; %{ public _FsdLexer() { - this((java.io.Reader)null); + this((java.io.Reader)null); } %} @@ -26,61 +26,405 @@ EOL=\R WHITE_SPACE=\s+ COMMENT="//"[^\r\n]* -SPACE=[ \t\n\x0B\f\r]+ -IDENTIFIER=[a-zA-Z_0-9]+ -TYPENAME=[a-zA-Z_0-9]+ -ATTRIBUTENAME=[a-zA-Z_0-9]+ +IDENTIFIER=[a-zA-Z0-9_]+ ATTRIBUTEPARAMETERVALUE=\"(([^\"\\]+|\\[\"\\/bfnrt]|\\u[0-9a-fA-f]{4})*)\"|([0-9a-zA-Z.+_-]+) NUMBER=[0-9]+(\.[0-9]*)? -MARKDOWNHEADING=#[^\r\n]* -MARKDOWNTEXT=.+ +MARKDOWN_HEADING=#[^\r\n]* +MARKDOWN_TEXT=.+ + +%state MARKDOWN_SECTION +%state SERVICE_ATTRIBUTE, SERVICE_ATTRIBUTE_PARAMETER_LIST, SERVICE_ATTRIBUTE_ARGUMENT +%state SERVICE_BODY, SERVICE_BODY_ATTRIBUTE, SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST, SERVICE_BODY_ATTRIBUTE_ARGUMENT +%state METHOD_BODY, METHOD_BODY_TYPE, METHOD_BODY_TYPE_END, METHOD_BODY_ATTRIBUTE, METHOD_BODY_ATTRIBUTE_PARAMETER_LIST, METHOD_BODY_ATTRIBUTE_ARGUMENT +%state RESPONSE_SEPARATOR, RESPONSE_BODY, RESPONSE_BODY_TYPE, RESPONSE_BODY_TYPE_END, RESPONSE_BODY_ATTRIBUTE, RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST, RESPONSE_BODY_ATTRIBUTE_ARGUMENT +%state DATA_BODY, DATA_BODY_TYPE, DATA_BODY_TYPE_END, DATA_BODY_ATTRIBUTE, DATA_BODY_ATTRIBUTE_PARAMETER_LIST, DATA_BODY_ATTRIBUTE_ARGUMENT +%state LIST_BODY, LIST_BODY_ATTRIBUTE, LIST_BODY_ATTRIBUTE_PARAMETER_LIST, LIST_BODY_ATTRIBUTE_ARGUMENT +%state EXTERN_DECL %% { - {WHITE_SPACE} { return WHITE_SPACE; } - - "(" { return LEFT_PAREN; } - ")" { return RIGHT_PAREN; } - "{" { return LEFT_BRACE; } - "}" { return RIGHT_BRACE; } - "[" { return LEFT_BRACKET; } - "]" { return RIGHT_BRACKET; } - "<" { return LEFT_ANGLE; } - ">" { return RIGHT_ANGLE; } - "," { return COMMA; } - ";" { return SEMI; } - ":" { return COLON; } - "!" { return BANG; } - "service" { return SERVICE; } - "extern" { return EXTERN; } - "enum" { return ENUM; } - "data" { return DATA; } - "errors" { return ERRORS; } - "method" { return METHOD; } - "string" { return STRING; } - "boolean" { return BOOLEAN; } - "int32" { return INT32; } - "int64" { return INT64; } - "double" { return DOUBLE; } - "decimal" { return DECIMAL; } - "datetime" { return DATETIME; } - "bytes" { return BYTES; } - "object" { return OBJECT; } - "map" { return MAP; } - "result" { return RESULT; } - "error" { return ERROR; } - "nullable" { return NULLABLE; } - - {COMMENT} { return COMMENT; } - {SPACE} { return SPACE; } - {IDENTIFIER} { return IDENTIFIER; } - {TYPENAME} { return TYPENAME; } - {ATTRIBUTENAME} { return ATTRIBUTENAME; } - {ATTRIBUTEPARAMETERVALUE} { return ATTRIBUTEPARAMETERVALUE; } - {NUMBER} { return NUMBER; } - {MARKDOWNHEADING} { return MARKDOWNHEADING; } - {MARKDOWNTEXT} { return MARKDOWNTEXT; } + {WHITE_SPACE} { return WHITE_SPACE; } + + "service" { yybegin(SERVICE_BODY); return SERVICE; } + + "[" { yybegin(SERVICE_ATTRIBUTE); return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + + {COMMENT} { return COMMENT; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "(" { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } + ")" { return RIGHT_PAREN; } + + {IDENTIFIER} { return ATTRIBUTENAME; } + , { return COMMA; } + ] { yybegin(YYINITIAL); return RIGHT_BRACKET; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + ")" { yybegin(SERVICE_ATTRIBUTE); return RIGHT_PAREN; } + , { return COMMA; } + + {IDENTIFIER} { yybegin(SERVICE_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + ":" { return COLON; } + {ATTRIBUTEPARAMETERVALUE} { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "extern" { yybegin(EXTERN_DECL); return EXTERN; } + "method" { yybegin(METHOD_BODY); return METHOD; } + "data" { yybegin(DATA_BODY); return DATA; } + "errors" { yybegin(LIST_BODY); return ERRORS; } + "enum" { yybegin(LIST_BODY); return ENUM; } + + "{" { return LEFT_BRACE; } + "}" { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } + "[" { yybegin(SERVICE_BODY_ATTRIBUTE); return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + + {IDENTIFIER} { return IDENTIFIER; } + {COMMENT} { return COMMENT; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "(" { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } + ")" { return RIGHT_PAREN; } + + {IDENTIFIER} { return ATTRIBUTENAME; } + , { return COMMA; } + ] { yybegin(SERVICE_BODY); return RIGHT_BRACKET; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + ")" { yybegin(SERVICE_BODY_ATTRIBUTE); return RIGHT_PAREN; } + , { return COMMA; } + + {IDENTIFIER} { yybegin(SERVICE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + ":" { return COLON; } + {ATTRIBUTEPARAMETERVALUE} { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "{" { return LEFT_BRACE; } + "}" { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } + ":" { yybegin(METHOD_BODY_TYPE); return COLON; } + "[" { yybegin(METHOD_BODY_ATTRIBUTE); return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + {COMMENT} { return COMMENT; } + {IDENTIFIER} { return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "(" { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } + ")" { return RIGHT_PAREN; } + + {IDENTIFIER} { return ATTRIBUTENAME; } + , { return COMMA; } + ] { yybegin(METHOD_BODY); return RIGHT_BRACKET; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + ")" { yybegin(METHOD_BODY_ATTRIBUTE); return RIGHT_PAREN; } + , { return COMMA; } + + {IDENTIFIER} { yybegin(METHOD_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + ":" { return COLON; } + {ATTRIBUTEPARAMETERVALUE} { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + {COMMENT} { return COMMENT; } + + "string" { yybegin(METHOD_BODY_TYPE_END); return STRING; } + "boolean" { yybegin(METHOD_BODY_TYPE_END); return BOOLEAN; } + "int32" { yybegin(METHOD_BODY_TYPE_END); return INT32; } + "int64" { yybegin(METHOD_BODY_TYPE_END); return INT64; } + "double" { yybegin(METHOD_BODY_TYPE_END); return DOUBLE; } + "decimal" { yybegin(METHOD_BODY_TYPE_END); return DECIMAL; } + "datetime" { yybegin(METHOD_BODY_TYPE_END); return DATETIME; } + "bytes" { yybegin(METHOD_BODY_TYPE_END); return BYTES; } + "object" { yybegin(METHOD_BODY_TYPE_END); return OBJECT; } + "map" { yybegin(METHOD_BODY_TYPE_END); return MAP; } + "result" { yybegin(METHOD_BODY_TYPE_END); return RESULT; } + "nullable" { yybegin(METHOD_BODY_TYPE_END); return NULLABLE; } + "error" { yybegin(METHOD_BODY_TYPE_END); return ERROR; } + + {IDENTIFIER} { yybegin(METHOD_BODY_TYPE_END); return TYPENAME; } + + "}" { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + {COMMENT} { return COMMENT; } + + "<" { yybegin(METHOD_BODY_TYPE); return LEFT_ANGLE; } + ">" { return RIGHT_ANGLE; } + "[" { return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + "!" { return BANG; } + + ";" { yybegin(METHOD_BODY); return SEMI; } + + // Identifiers shouldn't be here, so break back into the body definition + {IDENTIFIER} { yybegin(METHOD_BODY); return IDENTIFIER; } + "}" { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + {COMMENT} { return COMMENT; } + + ":" { yybegin(RESPONSE_BODY); return COLON; } + "}" { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } + + "method" { yybegin(METHOD_BODY); return METHOD; } + "data" { yybegin(DATA_BODY); return DATA; } + "errors" { yybegin(LIST_BODY); return ERRORS; } + "enum" { yybegin(LIST_BODY); return ENUM; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "{" { return LEFT_BRACE; } + "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } + ":" { yybegin(RESPONSE_BODY_TYPE); return COLON; } + "[" { yybegin(RESPONSE_BODY_ATTRIBUTE); return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + {COMMENT} { return COMMENT; } + {IDENTIFIER} { return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "(" { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } + ")" { return RIGHT_PAREN; } + + {IDENTIFIER} { return ATTRIBUTENAME; } + , { return COMMA; } + ] { yybegin(RESPONSE_BODY); return RIGHT_BRACKET; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + ")" { yybegin(RESPONSE_BODY_ATTRIBUTE); return RIGHT_PAREN; } + , { return COMMA; } + + {IDENTIFIER} { yybegin(RESPONSE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + ":" { return COLON; } + {ATTRIBUTEPARAMETERVALUE} { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + {COMMENT} { return COMMENT; } + + "string" { yybegin(RESPONSE_BODY_TYPE_END); return STRING; } + "boolean" { yybegin(RESPONSE_BODY_TYPE_END); return BOOLEAN; } + "int32" { yybegin(RESPONSE_BODY_TYPE_END); return INT32; } + "int64" { yybegin(RESPONSE_BODY_TYPE_END); return INT64; } + "double" { yybegin(RESPONSE_BODY_TYPE_END); return DOUBLE; } + "decimal" { yybegin(RESPONSE_BODY_TYPE_END); return DECIMAL; } + "datetime" { yybegin(RESPONSE_BODY_TYPE_END); return DATETIME; } + "bytes" { yybegin(RESPONSE_BODY_TYPE_END); return BYTES; } + "object" { yybegin(RESPONSE_BODY_TYPE_END); return OBJECT; } + "map" { yybegin(RESPONSE_BODY_TYPE_END); return MAP; } + "result" { yybegin(RESPONSE_BODY_TYPE_END); return RESULT; } + "nullable" { yybegin(RESPONSE_BODY_TYPE_END); return NULLABLE; } + "error" { yybegin(RESPONSE_BODY_TYPE_END); return ERROR; } + + {IDENTIFIER} { yybegin(RESPONSE_BODY_TYPE_END); return TYPENAME; } + + "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + {COMMENT} { return COMMENT; } + + "<" { yybegin(RESPONSE_BODY_TYPE); return LEFT_ANGLE; } + ">" { return RIGHT_ANGLE; } + "[" { return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + "!" { return BANG; } + + ";" { yybegin(RESPONSE_BODY); return SEMI; } + + // Identifiers shouldn't be here, so break back into the body definition + {IDENTIFIER} { yybegin(RESPONSE_BODY); return IDENTIFIER; } + "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "{" { return LEFT_BRACE; } + "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } + ":" { yybegin(DATA_BODY_TYPE); return COLON; } + "[" { yybegin(DATA_BODY_ATTRIBUTE); return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + {COMMENT} { return COMMENT; } + {IDENTIFIER} { return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "(" { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } + ")" { return RIGHT_PAREN; } + + {IDENTIFIER} { return ATTRIBUTENAME; } + , { return COMMA; } + ] { yybegin(DATA_BODY); return RIGHT_BRACKET; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + ")" { yybegin(DATA_BODY_ATTRIBUTE); return RIGHT_PAREN; } + , { return COMMA; } + + {IDENTIFIER} { yybegin(DATA_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + ":" { return COLON; } + {ATTRIBUTEPARAMETERVALUE} { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + {COMMENT} { return COMMENT; } + + "string" { yybegin(DATA_BODY_TYPE_END); return STRING; } + "boolean" { yybegin(DATA_BODY_TYPE_END); return BOOLEAN; } + "int32" { yybegin(DATA_BODY_TYPE_END); return INT32; } + "int64" { yybegin(DATA_BODY_TYPE_END); return INT64; } + "double" { yybegin(DATA_BODY_TYPE_END); return DOUBLE; } + "decimal" { yybegin(DATA_BODY_TYPE_END); return DECIMAL; } + "datetime" { yybegin(DATA_BODY_TYPE_END); return DATETIME; } + "bytes" { yybegin(DATA_BODY_TYPE_END); return BYTES; } + "object" { yybegin(DATA_BODY_TYPE_END); return OBJECT; } + "map" { yybegin(DATA_BODY_TYPE_END); return MAP; } + "result" { yybegin(DATA_BODY_TYPE_END); return RESULT; } + "nullable" { yybegin(DATA_BODY_TYPE_END); return NULLABLE; } + "error" { yybegin(DATA_BODY_TYPE_END); return ERROR; } + + {IDENTIFIER} { yybegin(DATA_BODY_TYPE_END); return TYPENAME; } + + "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + {COMMENT} { return COMMENT; } + + "<" { yybegin(DATA_BODY_TYPE); return LEFT_ANGLE; } + ">" { return RIGHT_ANGLE; } + "[" { return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + "!" { return BANG; } + + ";" { yybegin(DATA_BODY); return SEMI; } + + // Identifiers shouldn't be here, so break back into the body definition + {IDENTIFIER} { yybegin(DATA_BODY); return IDENTIFIER; } + "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "{" { return LEFT_BRACE; } + "}" { yybegin(SERVICE_BODY); return RIGHT_BRACE; } + "," { return COMMA; } + "[" { yybegin(LIST_BODY_ATTRIBUTE); return LEFT_BRACKET; } + "]" { return RIGHT_BRACKET; } + {COMMENT} { return COMMENT; } + {IDENTIFIER} { return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "(" { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } + ")" { return RIGHT_PAREN; } + + {IDENTIFIER} { return ATTRIBUTENAME; } + , { return COMMA; } + ] { yybegin(LIST_BODY); return RIGHT_BRACKET; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + ")" { yybegin(LIST_BODY_ATTRIBUTE); return RIGHT_PAREN; } + , { return COMMA; } + + {IDENTIFIER} { yybegin(LIST_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + ":" { return COLON; } + {ATTRIBUTEPARAMETERVALUE} { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } +} + + { + {WHITE_SPACE} { return WHITE_SPACE; } + + "data" { return DATA; } + "enum" { return ENUM; } + + ";" { yybegin(SERVICE_BODY); return SEMI; } + + {COMMENT} { return COMMENT; } + {IDENTIFIER} { return IDENTIFIER; } +} + { + \r { return WHITE_SPACE; } + \n { return WHITE_SPACE; } + {MARKDOWN_HEADING} { return MARKDOWNHEADING; } + {MARKDOWN_TEXT} { return MARKDOWNTEXT; } } [^] { return BAD_CHARACTER; } From 668a685644ed1758a5af5eebe6e7f2f72ea2ce02 Mon Sep 17 00:00:00 2001 From: bryankenote Date: Tue, 31 Dec 2024 14:53:21 -0800 Subject: [PATCH 04/11] Revert "add optional semicolon to cfg" This reverts commit 39623bc728248594fa3f922be0b5beaa777581ca. --- src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 2454b01..709d7a3 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -42,7 +42,7 @@ definition ::= (attribute_list* service_spec) markdown_remarks* -service_spec ::= (service identifier service_items[';']) { pin=1 } +service_spec ::= service identifier service_items { pin=1 } service_items ::= ('{' decorated_service_item* '}') | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } From 00157654ae093c1cf4fee24fe219b2396d2f12cb Mon Sep 17 00:00:00 2001 From: bryankenote Date: Tue, 31 Dec 2024 14:55:17 -0800 Subject: [PATCH 05/11] add optional semicolon to cfg --- .../intellij/parser/FsdParser.java | 25 ++++++++++++++++++- .../io/github/facilityapi/intellij/fsd.bnf | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index 2e2d4ae..bad4315 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -787,12 +787,13 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | decorated_service_item + // ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; Marker m = enter_section_(b, l, _NONE_, SERVICE_ITEMS, ""); r = service_items_0(b, l + 1); + if (!r) r = service_items_1(b, l + 1); if (!r) r = decorated_service_item(b, l + 1); exit_section_(b, l, m, r, false, null); return r; @@ -821,6 +822,28 @@ private static boolean service_items_0_1(PsiBuilder b, int l) { return true; } + // ';' decorated_service_item* + private static boolean service_items_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, SEMI); + r = r && service_items_1_1(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // decorated_service_item* + private static boolean service_items_1_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_1")) return false; + while (true) { + int c = current_position_(b); + if (!decorated_service_item(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "service_items_1_1", c)) break; + } + return true; + } + /* ********************************************************** */ // service identifier service_items public static boolean service_spec(PsiBuilder b, int l) { diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 709d7a3..d3337b2 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -43,7 +43,7 @@ definition ::= (attribute_list* service_spec) markdown_remarks* service_spec ::= service identifier service_items { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | decorated_service_item +service_items ::= ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method) From e44424d8fbed8fcf473de06cf051d362e7c4dd53 Mon Sep 17 00:00:00 2001 From: bryankenote Date: Thu, 2 Jan 2025 12:22:06 -0800 Subject: [PATCH 06/11] update lexer to handle semi colon as a part of the service body --- .../facilityapi/intellij/lexer/_FsdLexer.java | 1093 +++++++++-------- .../intellij/parser/FsdParser.java | 2 +- .../io/github/facilityapi/intellij/fsd.bnf | 2 +- .../facilityapi/intellij/lexer/_FsdLexer.flex | 1 + 4 files changed, 552 insertions(+), 546 deletions(-) diff --git a/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java b/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java index aae433b..ce06e7c 100644 --- a/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java +++ b/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java @@ -142,34 +142,34 @@ private static int zzUnpackcmap_blocks(String packed, int offset, int [] result) private static final String ZZ_ACTION_PACKED_0 = "\41\0\1\1\1\2\1\1\1\3\1\4\1\1\1\5"+ "\1\2\1\6\1\7\1\10\1\11\1\12\1\13\1\14"+ - "\1\15\1\1\1\16\1\17\1\20\1\21\3\20\1\22"+ - "\1\23\1\24\1\25\1\26\1\27\1\1\1\30\1\31"+ - "\1\32\1\33\12\34\1\35\1\36\1\37\1\40\1\41"+ - "\1\42\1\43\1\44\1\45\1\46\1\1\1\47\1\50"+ - "\3\1\1\51\1\52\1\53\12\54\1\55\1\56\1\57"+ - "\1\60\1\61\1\62\1\63\1\1\1\64\1\65\1\66"+ - "\12\67\1\70\1\71\1\72\1\73\1\74\1\75\1\76"+ - "\1\1\1\77\1\100\1\101\1\102\1\103\1\104\1\1"+ - "\1\105\1\106\2\20\1\107\2\0\1\16\1\0\5\20"+ - "\1\0\1\30\1\0\14\34\1\0\1\47\5\0\14\54"+ - "\1\0\1\64\1\0\14\67\1\0\1\77\2\0\1\105"+ - "\1\0\2\20\2\0\5\20\1\0\7\34\1\110\4\34"+ - "\5\0\7\54\1\111\4\54\1\0\7\67\1\112\4\67"+ - "\2\0\2\20\2\0\1\113\1\114\3\20\1\0\14\34"+ - "\1\0\1\113\1\114\2\0\14\54\1\0\14\67\2\0"+ - "\1\115\1\116\2\0\3\20\1\0\1\34\1\117\3\34"+ - "\1\120\1\121\1\122\4\34\3\0\1\54\1\123\3\54"+ - "\1\124\1\125\1\126\4\54\1\0\1\67\1\127\3\67"+ - "\1\130\1\131\1\132\4\67\4\0\1\133\1\134\1\135"+ - "\1\0\3\34\1\136\1\34\1\137\1\140\1\141\1\0"+ - "\1\133\1\135\3\54\1\142\1\54\1\143\1\144\1\145"+ - "\1\0\3\67\1\146\1\67\1\147\1\150\1\151\2\0"+ - "\1\152\1\153\1\34\1\154\1\34\1\155\1\54\1\156"+ - "\1\54\1\157\1\67\1\160\1\67\1\161\1\162\1\163"+ - "\1\164\1\165\1\166"; + "\1\15\1\1\1\16\1\17\1\20\1\21\1\22\3\20"+ + "\1\23\1\24\1\25\1\26\1\27\1\30\1\1\1\31"+ + "\1\32\1\33\1\34\12\35\1\36\1\37\1\40\1\41"+ + "\1\42\1\43\1\44\1\45\1\46\1\47\1\1\1\50"+ + "\1\51\3\1\1\52\1\53\1\54\12\55\1\56\1\57"+ + "\1\60\1\61\1\62\1\63\1\64\1\1\1\65\1\66"+ + "\1\67\12\70\1\71\1\72\1\73\1\74\1\75\1\76"+ + "\1\77\1\1\1\100\1\101\1\102\1\103\1\104\1\105"+ + "\1\1\1\106\1\107\2\20\1\110\2\0\1\16\1\0"+ + "\5\20\1\0\1\31\1\0\14\35\1\0\1\50\5\0"+ + "\14\55\1\0\1\65\1\0\14\70\1\0\1\100\2\0"+ + "\1\106\1\0\2\20\2\0\5\20\1\0\7\35\1\111"+ + "\4\35\5\0\7\55\1\112\4\55\1\0\7\70\1\113"+ + "\4\70\2\0\2\20\2\0\1\114\1\115\3\20\1\0"+ + "\14\35\1\0\1\114\1\115\2\0\14\55\1\0\14\70"+ + "\2\0\1\116\1\117\2\0\3\20\1\0\1\35\1\120"+ + "\3\35\1\121\1\122\1\123\4\35\3\0\1\55\1\124"+ + "\3\55\1\125\1\126\1\127\4\55\1\0\1\70\1\130"+ + "\3\70\1\131\1\132\1\133\4\70\4\0\1\134\1\135"+ + "\1\136\1\0\3\35\1\137\1\35\1\140\1\141\1\142"+ + "\1\0\1\134\1\136\3\55\1\143\1\55\1\144\1\145"+ + "\1\146\1\0\3\70\1\147\1\70\1\150\1\151\1\152"+ + "\2\0\1\153\1\154\1\35\1\155\1\35\1\156\1\55"+ + "\1\157\1\55\1\160\1\70\1\161\1\70\1\162\1\163"+ + "\1\164\1\165\1\166\1\167"; private static int [] zzUnpackAction() { - int [] result = new int[425]; + int [] result = new int[426]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -200,57 +200,57 @@ private static int zzUnpackAction(String packed, int offset, int [] result) { "\0\u04c8\0\u04fb\0\u052e\0\u0561\0\u0594\0\u05c7\0\u05fa\0\u062d"+ "\0\u0660\0\u0693\0\u06c6\0\u06f9\0\u0693\0\u0693\0\u072c\0\u075f"+ "\0\u0693\0\u0792\0\u0693\0\u0693\0\u0693\0\u07c5\0\u0693\0\u0693"+ - "\0\u07f8\0\u082b\0\u085e\0\u0693\0\u0891\0\u0693\0\u08c4\0\u08f7"+ - "\0\u092a\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u095d\0\u0990"+ - "\0\u09c3\0\u0693\0\u0693\0\u0693\0\u09f6\0\u0a29\0\u0a5c\0\u0a8f"+ - "\0\u0ac2\0\u0af5\0\u0b28\0\u0b5b\0\u0b8e\0\u0bc1\0\u0693\0\u0bf4"+ - "\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0c27"+ - "\0\u0c5a\0\u0c8d\0\u0693\0\u0cc0\0\u0cf3\0\u0d26\0\u0693\0\u0693"+ - "\0\u0693\0\u0d59\0\u0d8c\0\u0dbf\0\u0df2\0\u0e25\0\u0e58\0\u0e8b"+ - "\0\u0ebe\0\u0ef1\0\u0f24\0\u0f57\0\u0693\0\u0693\0\u0693\0\u0693"+ - "\0\u0693\0\u0f8a\0\u0fbd\0\u0ff0\0\u0693\0\u0693\0\u1023\0\u1056"+ - "\0\u1089\0\u10bc\0\u10ef\0\u1122\0\u1155\0\u1188\0\u11bb\0\u11ee"+ - "\0\u1221\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u1254\0\u1287"+ - "\0\u12ba\0\u0693\0\u0693\0\u0693\0\u0693\0\u12ed\0\u1320\0\u1353"+ - "\0\u0693\0\u1386\0\u13b9\0\u13ec\0\u141f\0\u082b\0\u0693\0\u1452"+ - "\0\u1485\0\u14b8\0\u14eb\0\u151e\0\u1551\0\u0990\0\u0693\0\u1584"+ - "\0\u15b7\0\u15ea\0\u161d\0\u1650\0\u1683\0\u16b6\0\u16e9\0\u171c"+ - "\0\u174f\0\u1782\0\u17b5\0\u17e8\0\u0c5a\0\u0693\0\u181b\0\u184e"+ - "\0\u1881\0\u18b4\0\u18e7\0\u191a\0\u194d\0\u1980\0\u19b3\0\u19e6"+ - "\0\u1a19\0\u1a4c\0\u1a7f\0\u1ab2\0\u1ae5\0\u1b18\0\u1b4b\0\u0fbd"+ - "\0\u0693\0\u1b7e\0\u1bb1\0\u1be4\0\u1c17\0\u1c4a\0\u1c7d\0\u1cb0"+ - "\0\u1ce3\0\u1d16\0\u1d49\0\u1d7c\0\u1daf\0\u1de2\0\u1287\0\u0693"+ - "\0\u1e15\0\u1320\0\u0693\0\u1e48\0\u1e7b\0\u1eae\0\u1ee1\0\u1f14"+ - "\0\u1f47\0\u1f7a\0\u1fad\0\u1fe0\0\u2013\0\u2046\0\u2079\0\u20ac"+ - "\0\u20df\0\u2112\0\u2145\0\u2178\0\u21ab\0\u09f6\0\u21de\0\u2211"+ - "\0\u2244\0\u2277\0\u22aa\0\u22dd\0\u2310\0\u2343\0\u2376\0\u23a9"+ - "\0\u23dc\0\u240f\0\u2442\0\u2475\0\u24a8\0\u24db\0\u0d59\0\u250e"+ - "\0\u2541\0\u2574\0\u25a7\0\u25da\0\u260d\0\u2640\0\u2673\0\u26a6"+ - "\0\u26d9\0\u270c\0\u273f\0\u1023\0\u2772\0\u27a5\0\u27d8\0\u280b"+ - "\0\u283e\0\u2871\0\u28a4\0\u28d7\0\u290a\0\u293d\0\u0891\0\u0891"+ - "\0\u2970\0\u29a3\0\u29d6\0\u2a09\0\u2a3c\0\u2a6f\0\u2aa2\0\u2ad5"+ - "\0\u2b08\0\u2b3b\0\u2b6e\0\u2ba1\0\u2bd4\0\u2c07\0\u2c3a\0\u2c6d"+ - "\0\u2ca0\0\u0693\0\u0693\0\u2cd3\0\u2d06\0\u2d39\0\u2d6c\0\u2d9f"+ - "\0\u2dd2\0\u2e05\0\u2e38\0\u2e6b\0\u2e9e\0\u2ed1\0\u2f04\0\u2f37"+ - "\0\u2f6a\0\u2f9d\0\u2fd0\0\u3003\0\u3036\0\u3069\0\u309c\0\u30cf"+ - "\0\u3102\0\u3135\0\u3168\0\u319b\0\u31ce\0\u3201\0\u3234\0\u3267"+ - "\0\u0891\0\u0891\0\u329a\0\u32cd\0\u3300\0\u3333\0\u3366\0\u3399"+ - "\0\u33cc\0\u09f6\0\u33ff\0\u3432\0\u3465\0\u09f6\0\u09f6\0\u09f6"+ - "\0\u3498\0\u34cb\0\u34fe\0\u3531\0\u3564\0\u3597\0\u35ca\0\u35fd"+ - "\0\u0d59\0\u3630\0\u3663\0\u3696\0\u0d59\0\u0d59\0\u0d59\0\u36c9"+ - "\0\u36fc\0\u372f\0\u3762\0\u3795\0\u37c8\0\u1023\0\u37fb\0\u382e"+ - "\0\u3861\0\u1023\0\u1023\0\u1023\0\u3894\0\u38c7\0\u38fa\0\u392d"+ - "\0\u3960\0\u3993\0\u39c6\0\u39f9\0\u0891\0\u0891\0\u0891\0\u3a2c"+ - "\0\u3a5f\0\u3a92\0\u3ac5\0\u09f6\0\u3af8\0\u09f6\0\u09f6\0\u09f6"+ - "\0\u3b2b\0\u0693\0\u0693\0\u3b5e\0\u3b91\0\u3bc4\0\u0d59\0\u3bf7"+ - "\0\u0d59\0\u0d59\0\u0d59\0\u3c2a\0\u3c5d\0\u3c90\0\u3cc3\0\u1023"+ - "\0\u3cf6\0\u1023\0\u1023\0\u1023\0\u3d29\0\u3d5c\0\u0693\0\u09f6"+ - "\0\u3d8f\0\u09f6\0\u3dc2\0\u0d59\0\u3df5\0\u0d59\0\u3e28\0\u1023"+ - "\0\u3e5b\0\u1023\0\u3e8e\0\u09f6\0\u09f6\0\u0d59\0\u0d59\0\u1023"+ - "\0\u1023"; + "\0\u07f8\0\u082b\0\u085e\0\u0693\0\u0891\0\u0693\0\u0693\0\u08c4"+ + "\0\u08f7\0\u092a\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u095d"+ + "\0\u0990\0\u09c3\0\u0693\0\u0693\0\u0693\0\u09f6\0\u0a29\0\u0a5c"+ + "\0\u0a8f\0\u0ac2\0\u0af5\0\u0b28\0\u0b5b\0\u0b8e\0\u0bc1\0\u0693"+ + "\0\u0bf4\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693"+ + "\0\u0c27\0\u0c5a\0\u0c8d\0\u0693\0\u0cc0\0\u0cf3\0\u0d26\0\u0693"+ + "\0\u0693\0\u0693\0\u0d59\0\u0d8c\0\u0dbf\0\u0df2\0\u0e25\0\u0e58"+ + "\0\u0e8b\0\u0ebe\0\u0ef1\0\u0f24\0\u0f57\0\u0693\0\u0693\0\u0693"+ + "\0\u0693\0\u0693\0\u0f8a\0\u0fbd\0\u0ff0\0\u0693\0\u0693\0\u1023"+ + "\0\u1056\0\u1089\0\u10bc\0\u10ef\0\u1122\0\u1155\0\u1188\0\u11bb"+ + "\0\u11ee\0\u1221\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u1254"+ + "\0\u1287\0\u12ba\0\u0693\0\u0693\0\u0693\0\u0693\0\u12ed\0\u1320"+ + "\0\u1353\0\u0693\0\u1386\0\u13b9\0\u13ec\0\u141f\0\u082b\0\u0693"+ + "\0\u1452\0\u1485\0\u14b8\0\u14eb\0\u151e\0\u1551\0\u0990\0\u0693"+ + "\0\u1584\0\u15b7\0\u15ea\0\u161d\0\u1650\0\u1683\0\u16b6\0\u16e9"+ + "\0\u171c\0\u174f\0\u1782\0\u17b5\0\u17e8\0\u0c5a\0\u0693\0\u181b"+ + "\0\u184e\0\u1881\0\u18b4\0\u18e7\0\u191a\0\u194d\0\u1980\0\u19b3"+ + "\0\u19e6\0\u1a19\0\u1a4c\0\u1a7f\0\u1ab2\0\u1ae5\0\u1b18\0\u1b4b"+ + "\0\u0fbd\0\u0693\0\u1b7e\0\u1bb1\0\u1be4\0\u1c17\0\u1c4a\0\u1c7d"+ + "\0\u1cb0\0\u1ce3\0\u1d16\0\u1d49\0\u1d7c\0\u1daf\0\u1de2\0\u1287"+ + "\0\u0693\0\u1e15\0\u1320\0\u0693\0\u1e48\0\u1e7b\0\u1eae\0\u1ee1"+ + "\0\u1f14\0\u1f47\0\u1f7a\0\u1fad\0\u1fe0\0\u2013\0\u2046\0\u2079"+ + "\0\u20ac\0\u20df\0\u2112\0\u2145\0\u2178\0\u21ab\0\u09f6\0\u21de"+ + "\0\u2211\0\u2244\0\u2277\0\u22aa\0\u22dd\0\u2310\0\u2343\0\u2376"+ + "\0\u23a9\0\u23dc\0\u240f\0\u2442\0\u2475\0\u24a8\0\u24db\0\u0d59"+ + "\0\u250e\0\u2541\0\u2574\0\u25a7\0\u25da\0\u260d\0\u2640\0\u2673"+ + "\0\u26a6\0\u26d9\0\u270c\0\u273f\0\u1023\0\u2772\0\u27a5\0\u27d8"+ + "\0\u280b\0\u283e\0\u2871\0\u28a4\0\u28d7\0\u290a\0\u293d\0\u0891"+ + "\0\u0891\0\u2970\0\u29a3\0\u29d6\0\u2a09\0\u2a3c\0\u2a6f\0\u2aa2"+ + "\0\u2ad5\0\u2b08\0\u2b3b\0\u2b6e\0\u2ba1\0\u2bd4\0\u2c07\0\u2c3a"+ + "\0\u2c6d\0\u2ca0\0\u0693\0\u0693\0\u2cd3\0\u2d06\0\u2d39\0\u2d6c"+ + "\0\u2d9f\0\u2dd2\0\u2e05\0\u2e38\0\u2e6b\0\u2e9e\0\u2ed1\0\u2f04"+ + "\0\u2f37\0\u2f6a\0\u2f9d\0\u2fd0\0\u3003\0\u3036\0\u3069\0\u309c"+ + "\0\u30cf\0\u3102\0\u3135\0\u3168\0\u319b\0\u31ce\0\u3201\0\u3234"+ + "\0\u3267\0\u0891\0\u0891\0\u329a\0\u32cd\0\u3300\0\u3333\0\u3366"+ + "\0\u3399\0\u33cc\0\u09f6\0\u33ff\0\u3432\0\u3465\0\u09f6\0\u09f6"+ + "\0\u09f6\0\u3498\0\u34cb\0\u34fe\0\u3531\0\u3564\0\u3597\0\u35ca"+ + "\0\u35fd\0\u0d59\0\u3630\0\u3663\0\u3696\0\u0d59\0\u0d59\0\u0d59"+ + "\0\u36c9\0\u36fc\0\u372f\0\u3762\0\u3795\0\u37c8\0\u1023\0\u37fb"+ + "\0\u382e\0\u3861\0\u1023\0\u1023\0\u1023\0\u3894\0\u38c7\0\u38fa"+ + "\0\u392d\0\u3960\0\u3993\0\u39c6\0\u39f9\0\u0891\0\u0891\0\u0891"+ + "\0\u3a2c\0\u3a5f\0\u3a92\0\u3ac5\0\u09f6\0\u3af8\0\u09f6\0\u09f6"+ + "\0\u09f6\0\u3b2b\0\u0693\0\u0693\0\u3b5e\0\u3b91\0\u3bc4\0\u0d59"+ + "\0\u3bf7\0\u0d59\0\u0d59\0\u0d59\0\u3c2a\0\u3c5d\0\u3c90\0\u3cc3"+ + "\0\u1023\0\u3cf6\0\u1023\0\u1023\0\u1023\0\u3d29\0\u3d5c\0\u0693"+ + "\0\u09f6\0\u3d8f\0\u09f6\0\u3dc2\0\u0d59\0\u3df5\0\u0d59\0\u3e28"+ + "\0\u1023\0\u3e5b\0\u1023\0\u3e8e\0\u09f6\0\u09f6\0\u0d59\0\u0d59"+ + "\0\u1023\0\u1023"; private static int [] zzUnpackRowMap() { - int [] result = new int[425]; + int [] result = new int[426]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -280,253 +280,253 @@ private static int zzUnpackRowMap(String packed, int offset, int [] result) { "\4\42\1\60\1\42\1\55\1\42\5\61\10\42\27\61"+ "\4\42\3\43\1\42\1\62\3\42\1\63\2\42\5\63"+ "\1\64\7\42\27\63\4\42\3\43\7\42\1\44\5\65"+ - "\4\42\1\66\1\42\1\46\1\42\3\65\1\67\1\70"+ - "\7\65\1\71\12\65\1\72\1\73\2\42\3\43\3\42"+ - "\1\74\1\54\1\42\1\55\1\42\5\56\6\42\1\75"+ - "\1\42\27\56\4\42\3\43\4\42\1\76\1\42\1\55"+ - "\1\42\5\77\10\42\27\77\4\42\3\43\1\42\1\100"+ - "\3\42\1\101\2\42\5\101\1\64\7\42\27\101\4\42"+ - "\3\43\7\42\1\44\5\65\1\102\3\42\1\103\1\42"+ - "\1\46\1\42\27\65\1\72\1\104\2\42\3\43\7\42"+ - "\1\44\5\105\10\42\1\105\1\106\1\105\1\107\1\110"+ - "\3\105\1\111\3\105\1\112\1\113\1\114\1\105\1\115"+ - "\1\116\5\105\1\42\1\104\2\42\3\43\1\117\6\42"+ - "\1\44\5\120\1\42\1\121\1\122\1\123\1\124\1\42"+ - "\1\46\1\42\27\120\1\42\1\104\2\42\3\43\3\42"+ - "\1\125\1\54\1\42\1\55\1\42\5\56\6\42\1\126"+ - "\1\42\27\56\4\42\3\43\4\42\1\127\1\42\1\55"+ - "\1\42\5\130\10\42\27\130\4\42\3\43\1\42\1\131"+ - "\3\42\1\132\2\42\5\132\1\64\7\42\27\132\4\42"+ - "\3\43\7\42\1\44\5\42\1\133\12\42\1\134\1\135"+ - "\7\42\1\136\13\42\1\73\2\42\3\43\7\42\1\44"+ - "\5\65\1\137\3\42\1\140\1\42\1\46\1\42\27\65"+ - "\1\72\1\141\2\42\3\43\7\42\1\44\5\142\10\42"+ - "\1\142\1\143\1\142\1\144\1\145\3\142\1\146\3\142"+ - "\1\147\1\150\1\151\1\142\1\152\1\153\5\142\1\42"+ - "\1\141\2\42\3\43\1\117\6\42\1\44\5\154\1\42"+ - "\1\155\1\156\1\123\1\124\1\42\1\46\1\42\27\154"+ - "\1\42\1\141\2\42\3\43\3\42\1\157\1\54\1\42"+ - "\1\55\1\42\5\56\6\42\1\160\1\42\27\56\4\42"+ - "\3\43\4\42\1\161\1\42\1\55\1\42\5\162\10\42"+ - "\27\162\4\42\3\43\1\42\1\163\3\42\1\164\2\42"+ - "\5\164\1\64\7\42\27\164\4\42\3\43\7\42\1\44"+ - "\5\65\1\165\3\42\1\166\1\42\1\46\1\42\27\65"+ - "\1\72\1\141\2\42\3\43\7\42\1\44\5\167\10\42"+ - "\1\167\1\170\1\167\1\171\1\172\3\167\1\173\3\167"+ - "\1\174\1\175\1\176\1\167\1\177\1\200\5\167\1\42"+ - "\1\141\2\42\3\43\1\117\6\42\1\44\5\201\1\42"+ - "\1\202\1\203\1\123\1\124\1\42\1\46\1\42\27\201"+ - "\1\42\1\141\2\42\3\43\3\42\1\204\1\54\1\42"+ - "\1\55\1\42\5\56\6\42\1\205\1\42\27\56\4\42"+ - "\3\43\4\42\1\206\1\42\1\55\1\42\5\207\10\42"+ - "\27\207\4\42\3\43\1\42\1\210\3\42\1\211\2\42"+ - "\5\211\1\64\7\42\27\211\4\42\3\43\6\42\1\55"+ - "\1\44\5\65\4\42\1\212\1\42\1\46\1\42\27\65"+ - "\1\72\1\141\2\42\3\43\3\42\1\213\1\54\1\42"+ - "\1\55\1\42\5\56\6\42\1\214\1\42\27\56\4\42"+ - "\3\43\4\42\1\215\1\42\1\55\1\42\5\216\10\42"+ - "\27\216\4\42\3\43\1\42\1\217\3\42\1\220\2\42"+ - "\5\220\1\64\7\42\27\220\4\42\3\43\7\42\1\44"+ - "\5\65\1\42\1\221\6\42\3\65\1\222\1\223\22\65"+ - "\3\42\64\0\3\43\72\0\1\224\104\0\1\225\25\0"+ - "\2\50\2\0\56\50\1\0\2\52\1\0\60\52\14\0"+ - "\5\56\10\0\27\56\17\0\5\61\10\0\27\61\3\0"+ - "\5\226\1\227\20\226\1\230\34\226\11\0\1\63\2\0"+ - "\5\63\10\0\27\63\17\0\5\65\10\0\27\65\17\0"+ - "\5\65\10\0\1\231\26\65\17\0\5\65\10\0\15\65"+ - "\1\232\2\65\1\233\4\65\1\234\1\65\17\0\5\65"+ - "\10\0\4\65\1\235\22\65\17\0\5\77\10\0\27\77"+ - "\3\0\5\236\1\237\20\236\1\240\34\236\11\0\1\101"+ - "\2\0\5\101\10\0\27\101\17\0\5\105\10\0\27\105"+ - "\17\0\5\105\10\0\16\105\1\241\7\105\1\242\17\0"+ - "\5\105\10\0\1\243\3\105\1\244\11\105\1\245\10\105"+ - "\17\0\5\105\10\0\20\105\1\246\6\105\17\0\5\105"+ - "\10\0\15\105\1\247\11\105\17\0\5\105\10\0\1\250"+ - "\26\105\17\0\5\105\10\0\23\105\1\251\3\105\17\0"+ - "\5\105\10\0\1\105\1\252\25\105\17\0\5\105\10\0"+ - "\4\105\1\253\22\105\17\0\5\105\10\0\22\105\1\254"+ - "\4\105\17\0\5\120\10\0\27\120\17\0\5\130\10\0"+ - "\27\130\3\0\5\255\1\256\20\255\1\257\34\255\11\0"+ - "\1\132\2\0\5\132\10\0\27\132\34\0\1\260\77\0"+ - "\1\261\2\0\1\262\46\0\1\263\41\0\5\142\10\0"+ - "\27\142\17\0\5\142\10\0\16\142\1\264\7\142\1\265"+ - "\17\0\5\142\10\0\1\266\3\142\1\267\11\142\1\270"+ - "\10\142\17\0\5\142\10\0\20\142\1\271\6\142\17\0"+ - "\5\142\10\0\15\142\1\272\11\142\17\0\5\142\10\0"+ - "\1\273\26\142\17\0\5\142\10\0\23\142\1\274\3\142"+ - "\17\0\5\142\10\0\1\142\1\275\25\142\17\0\5\142"+ - "\10\0\4\142\1\276\22\142\17\0\5\142\10\0\22\142"+ - "\1\277\4\142\17\0\5\154\10\0\27\154\17\0\5\162"+ - "\10\0\27\162\3\0\5\300\1\301\20\300\1\302\34\300"+ - "\11\0\1\164\2\0\5\164\10\0\27\164\17\0\5\167"+ - "\10\0\27\167\17\0\5\167\10\0\16\167\1\303\7\167"+ - "\1\304\17\0\5\167\10\0\1\305\3\167\1\306\11\167"+ - "\1\307\10\167\17\0\5\167\10\0\20\167\1\310\6\167"+ - "\17\0\5\167\10\0\15\167\1\311\11\167\17\0\5\167"+ - "\10\0\1\312\26\167\17\0\5\167\10\0\23\167\1\313"+ - "\3\167\17\0\5\167\10\0\1\167\1\314\25\167\17\0"+ - "\5\167\10\0\4\167\1\315\22\167\17\0\5\167\10\0"+ - "\22\167\1\316\4\167\17\0\5\201\10\0\27\201\17\0"+ - "\5\207\10\0\27\207\3\0\5\317\1\320\20\317\1\321"+ - "\34\317\11\0\1\211\2\0\5\211\10\0\27\211\17\0"+ - "\5\216\10\0\27\216\3\0\5\322\1\323\20\322\1\324"+ - "\34\322\11\0\1\220\2\0\5\220\10\0\27\220\17\0"+ - "\5\65\10\0\1\325\26\65\17\0\5\65\10\0\15\65"+ - "\1\326\11\65\3\0\2\224\1\0\60\224\51\0\1\327"+ - "\16\0\1\226\5\0\1\226\12\0\1\226\3\0\1\226"+ - "\3\0\1\226\7\0\1\226\2\0\1\226\1\0\1\226"+ - "\1\330\22\0\5\65\10\0\22\65\1\331\4\65\17\0"+ - "\5\65\10\0\23\65\1\332\3\65\17\0\5\65\10\0"+ - "\20\65\1\333\6\65\17\0\5\65\10\0\22\65\1\334"+ - "\4\65\17\0\5\65\10\0\22\65\1\335\4\65\10\0"+ - "\1\236\5\0\1\236\12\0\1\236\3\0\1\236\3\0"+ - "\1\236\7\0\1\236\2\0\1\236\1\0\1\236\1\336"+ - "\22\0\5\105\10\0\16\105\1\337\10\105\17\0\5\105"+ - "\10\0\22\105\1\340\4\105\17\0\5\105\10\0\22\105"+ - "\1\341\4\105\17\0\5\105\10\0\2\105\1\342\24\105"+ - "\17\0\5\105\10\0\23\105\1\343\3\105\17\0\5\105"+ - "\10\0\20\105\1\344\6\105\17\0\5\105\10\0\22\105"+ - "\1\345\4\105\17\0\5\105\10\0\17\105\1\346\7\105"+ - "\17\0\5\105\10\0\13\105\1\347\13\105\17\0\5\105"+ - "\10\0\11\105\1\350\15\105\17\0\5\105\10\0\21\105"+ - "\1\351\5\105\17\0\5\105\10\0\20\105\1\352\6\105"+ - "\10\0\1\255\5\0\1\255\12\0\1\255\3\0\1\255"+ - "\3\0\1\255\7\0\1\255\2\0\1\255\1\0\1\255"+ - "\1\353\61\0\1\354\63\0\1\355\57\0\1\356\64\0"+ - "\1\357\23\0\5\142\10\0\16\142\1\360\10\142\17\0"+ - "\5\142\10\0\22\142\1\361\4\142\17\0\5\142\10\0"+ - "\22\142\1\362\4\142\17\0\5\142\10\0\2\142\1\363"+ - "\24\142\17\0\5\142\10\0\23\142\1\364\3\142\17\0"+ - "\5\142\10\0\20\142\1\365\6\142\17\0\5\142\10\0"+ - "\22\142\1\366\4\142\17\0\5\142\10\0\17\142\1\367"+ - "\7\142\17\0\5\142\10\0\13\142\1\370\13\142\17\0"+ - "\5\142\10\0\11\142\1\371\15\142\17\0\5\142\10\0"+ - "\21\142\1\372\5\142\17\0\5\142\10\0\20\142\1\373"+ - "\6\142\10\0\1\300\5\0\1\300\12\0\1\300\3\0"+ - "\1\300\3\0\1\300\7\0\1\300\2\0\1\300\1\0"+ - "\1\300\1\374\22\0\5\167\10\0\16\167\1\375\10\167"+ - "\17\0\5\167\10\0\22\167\1\376\4\167\17\0\5\167"+ - "\10\0\22\167\1\377\4\167\17\0\5\167\10\0\2\167"+ - "\1\u0100\24\167\17\0\5\167\10\0\23\167\1\u0101\3\167"+ - "\17\0\5\167\10\0\20\167\1\u0102\6\167\17\0\5\167"+ - "\10\0\22\167\1\u0103\4\167\17\0\5\167\10\0\17\167"+ - "\1\u0104\7\167\17\0\5\167\10\0\13\167\1\u0105\13\167"+ - "\17\0\5\167\10\0\11\167\1\u0106\15\167\17\0\5\167"+ - "\10\0\21\167\1\u0107\5\167\17\0\5\167\10\0\20\167"+ - "\1\u0108\6\167\10\0\1\317\5\0\1\317\12\0\1\317"+ - "\3\0\1\317\3\0\1\317\7\0\1\317\2\0\1\317"+ - "\1\0\1\317\1\u0109\13\0\1\322\5\0\1\322\12\0"+ - "\1\322\3\0\1\322\3\0\1\322\7\0\1\322\2\0"+ - "\1\322\1\0\1\322\1\u010a\22\0\5\65\10\0\22\65"+ - "\1\u010b\4\65\17\0\5\65\10\0\23\65\1\u010c\3\65"+ - "\60\0\1\u010d\21\0\5\u010e\4\0\12\u010e\40\0\5\65"+ - "\10\0\1\u010f\26\65\17\0\5\65\10\0\14\65\1\u0110"+ - "\12\65\17\0\5\65\10\0\16\65\1\u0111\10\65\17\0"+ - "\5\65\10\0\4\65\1\u0112\22\65\17\0\5\65\10\0"+ - "\7\65\1\u0113\17\65\17\0\5\u0114\4\0\12\u0114\40\0"+ - "\5\105\10\0\13\105\1\u0115\13\105\17\0\5\105\10\0"+ - "\4\105\1\u0116\22\105\17\0\5\105\10\0\4\105\1\u0117"+ - "\22\105\17\0\5\105\10\0\10\105\1\u0118\16\105\17\0"+ - "\5\105\10\0\1\105\1\u0119\25\105\17\0\5\105\10\0"+ - "\16\105\1\u011a\10\105\17\0\2\105\1\u011b\1\105\1\u011c"+ - "\10\0\27\105\17\0\5\105\10\0\13\105\1\u011d\13\105"+ - "\17\0\5\105\10\0\4\105\1\u011e\22\105\17\0\5\105"+ - "\10\0\23\105\1\u011f\3\105\17\0\5\105\10\0\10\105"+ - "\1\u0120\16\105\17\0\5\u0121\4\0\12\u0121\55\0\1\u0122"+ - "\76\0\1\u0123\64\0\1\u0124\53\0\1\u0125\36\0\5\142"+ - "\10\0\13\142\1\u0126\13\142\17\0\5\142\10\0\4\142"+ - "\1\u0127\22\142\17\0\5\142\10\0\4\142\1\u0128\22\142"+ - "\17\0\5\142\10\0\10\142\1\u0129\16\142\17\0\5\142"+ - "\10\0\1\142\1\u012a\25\142\17\0\5\142\10\0\16\142"+ - "\1\u012b\10\142\17\0\2\142\1\u012c\1\142\1\u012d\10\0"+ - "\27\142\17\0\5\142\10\0\13\142\1\u012e\13\142\17\0"+ - "\5\142\10\0\4\142\1\u012f\22\142\17\0\5\142\10\0"+ - "\23\142\1\u0130\3\142\17\0\5\142\10\0\10\142\1\u0131"+ - "\16\142\17\0\5\u0132\4\0\12\u0132\40\0\5\167\10\0"+ - "\13\167\1\u0133\13\167\17\0\5\167\10\0\4\167\1\u0134"+ - "\22\167\17\0\5\167\10\0\4\167\1\u0135\22\167\17\0"+ - "\5\167\10\0\10\167\1\u0136\16\167\17\0\5\167\10\0"+ - "\1\167\1\u0137\25\167\17\0\5\167\10\0\16\167\1\u0138"+ - "\10\167\17\0\2\167\1\u0139\1\167\1\u013a\10\0\27\167"+ - "\17\0\5\167\10\0\13\167\1\u013b\13\167\17\0\5\167"+ - "\10\0\4\167\1\u013c\22\167\17\0\5\167\10\0\23\167"+ - "\1\u013d\3\167\17\0\5\167\10\0\10\167\1\u013e\16\167"+ - "\17\0\5\u013f\4\0\12\u013f\40\0\5\u0140\4\0\12\u0140"+ - "\40\0\5\65\10\0\1\u0141\26\65\17\0\5\65\10\0"+ - "\14\65\1\u0142\12\65\44\0\1\u0143\35\0\5\u0144\4\0"+ - "\12\u0144\40\0\5\65\10\0\20\65\1\u0145\6\65\17\0"+ - "\5\65\10\0\20\65\1\u0146\6\65\17\0\5\65\10\0"+ - "\16\65\1\u0147\10\65\17\0\5\u0148\4\0\12\u0148\40\0"+ - "\5\105\10\0\4\105\1\u0149\22\105\17\0\5\105\10\0"+ - "\21\105\1\u014a\5\105\17\0\5\105\10\0\22\105\1\u014b"+ - "\4\105\17\0\5\105\10\0\14\105\1\u014c\12\105\17\0"+ - "\5\105\10\0\13\105\1\u014d\13\105\17\0\5\105\10\0"+ - "\20\105\1\u014e\6\105\17\0\1\105\1\u014f\3\105\10\0"+ - "\27\105\17\0\3\105\1\u0150\1\105\10\0\27\105\17\0"+ - "\5\105\10\0\1\u0151\26\105\17\0\5\105\10\0\2\105"+ - "\1\u0152\24\105\17\0\5\105\10\0\13\105\1\u0153\13\105"+ - "\17\0\5\105\10\0\15\105\1\u0154\11\105\17\0\5\u0155"+ - "\4\0\12\u0155\75\0\1\u0156\60\0\1\u0157\27\0\5\142"+ - "\10\0\4\142\1\u0158\22\142\17\0\5\142\10\0\21\142"+ - "\1\u0159\5\142\17\0\5\142\10\0\22\142\1\u015a\4\142"+ - "\17\0\5\142\10\0\14\142\1\u015b\12\142\17\0\5\142"+ - "\10\0\13\142\1\u015c\13\142\17\0\5\142\10\0\20\142"+ - "\1\u015d\6\142\17\0\1\142\1\u015e\3\142\10\0\27\142"+ - "\17\0\3\142\1\u015f\1\142\10\0\27\142\17\0\5\142"+ - "\10\0\1\u0160\26\142\17\0\5\142\10\0\2\142\1\u0161"+ - "\24\142\17\0\5\142\10\0\13\142\1\u0162\13\142\17\0"+ - "\5\142\10\0\15\142\1\u0163\11\142\17\0\5\u0164\4\0"+ - "\12\u0164\40\0\5\167\10\0\4\167\1\u0165\22\167\17\0"+ - "\5\167\10\0\21\167\1\u0166\5\167\17\0\5\167\10\0"+ - "\22\167\1\u0167\4\167\17\0\5\167\10\0\14\167\1\u0168"+ - "\12\167\17\0\5\167\10\0\13\167\1\u0169\13\167\17\0"+ - "\5\167\10\0\20\167\1\u016a\6\167\17\0\1\167\1\u016b"+ - "\3\167\10\0\27\167\17\0\3\167\1\u016c\1\167\10\0"+ - "\27\167\17\0\5\167\10\0\1\u016d\26\167\17\0\5\167"+ - "\10\0\2\167\1\u016e\24\167\17\0\5\167\10\0\13\167"+ - "\1\u016f\13\167\17\0\5\167\10\0\15\167\1\u0170\11\167"+ - "\17\0\5\u0171\4\0\12\u0171\40\0\5\u0172\4\0\12\u0172"+ - "\57\0\1\u0173\43\0\5\u0174\4\0\12\u0174\40\0\5\65"+ - "\10\0\21\65\1\u0175\5\65\17\0\5\65\10\0\15\65"+ - "\1\u0176\11\65\17\0\5\65\10\0\3\65\1\u0177\23\65"+ - "\17\0\5\u0178\4\0\12\u0178\40\0\5\105\10\0\1\u0179"+ - "\26\105\17\0\5\105\10\0\10\105\1\u017a\16\105\17\0"+ - "\5\105\10\0\1\u017b\26\105\17\0\5\105\10\0\4\105"+ - "\1\u017c\22\105\17\0\5\105\10\0\1\105\1\u017d\25\105"+ - "\17\0\5\105\10\0\22\105\1\u017e\4\105\17\0\5\105"+ - "\10\0\22\105\1\u017f\4\105\17\0\5\105\10\0\6\105"+ - "\1\u0180\20\105\17\0\5\u0181\4\0\12\u0181\76\0\1\u0182"+ - "\44\0\1\u0183\42\0\5\142\10\0\1\u0184\26\142\17\0"+ - "\5\142\10\0\10\142\1\u0185\16\142\17\0\5\142\10\0"+ - "\1\u0186\26\142\17\0\5\142\10\0\4\142\1\u0187\22\142"+ - "\17\0\5\142\10\0\1\142\1\u0188\25\142\17\0\5\142"+ - "\10\0\22\142\1\u0189\4\142\17\0\5\142\10\0\22\142"+ - "\1\u018a\4\142\17\0\5\142\10\0\6\142\1\u018b\20\142"+ - "\17\0\5\u018c\4\0\12\u018c\40\0\5\167\10\0\1\u018d"+ - "\26\167\17\0\5\167\10\0\10\167\1\u018e\16\167\17\0"+ - "\5\167\10\0\1\u018f\26\167\17\0\5\167\10\0\4\167"+ - "\1\u0190\22\167\17\0\5\167\10\0\1\167\1\u0191\25\167"+ - "\17\0\5\167\10\0\22\167\1\u0192\4\167\17\0\5\167"+ - "\10\0\22\167\1\u0193\4\167\17\0\5\167\10\0\6\167"+ - "\1\u0194\20\167\17\0\5\u0195\4\0\12\u0195\40\0\5\u0196"+ - "\4\0\12\u0196\61\0\1\u0197\41\0\5\226\4\0\12\226"+ - "\40\0\5\236\4\0\12\236\40\0\5\105\10\0\15\105"+ - "\1\u0198\11\105\17\0\5\105\10\0\14\105\1\u0199\12\105"+ - "\17\0\5\105\10\0\13\105\1\u019a\13\105\17\0\5\105"+ - "\10\0\13\105\1\u019b\13\105\17\0\5\255\4\0\12\255"+ - "\40\0\5\142\10\0\15\142\1\u019c\11\142\17\0\5\142"+ - "\10\0\14\142\1\u019d\12\142\17\0\5\142\10\0\13\142"+ - "\1\u019e\13\142\17\0\5\142\10\0\13\142\1\u019f\13\142"+ - "\17\0\5\300\4\0\12\300\40\0\5\167\10\0\15\167"+ - "\1\u01a0\11\167\17\0\5\167\10\0\14\167\1\u01a1\12\167"+ - "\17\0\5\167\10\0\13\167\1\u01a2\13\167\17\0\5\167"+ - "\10\0\13\167\1\u01a3\13\167\17\0\5\317\4\0\12\317"+ - "\40\0\5\322\4\0\12\322\40\0\5\105\10\0\4\105"+ - "\1\u01a4\22\105\17\0\5\105\10\0\4\105\1\u01a5\22\105"+ - "\17\0\5\142\10\0\4\142\1\u01a6\22\142\17\0\5\142"+ - "\10\0\4\142\1\u01a7\22\142\17\0\5\167\10\0\4\167"+ - "\1\u01a8\22\167\17\0\5\167\10\0\4\167\1\u01a9\22\167"+ - "\3\0"; + "\1\42\1\66\2\42\1\67\1\42\1\46\1\42\3\65"+ + "\1\70\1\71\7\65\1\72\12\65\1\73\1\74\2\42"+ + "\3\43\3\42\1\75\1\54\1\42\1\55\1\42\5\56"+ + "\6\42\1\76\1\42\27\56\4\42\3\43\4\42\1\77"+ + "\1\42\1\55\1\42\5\100\10\42\27\100\4\42\3\43"+ + "\1\42\1\101\3\42\1\102\2\42\5\102\1\64\7\42"+ + "\27\102\4\42\3\43\7\42\1\44\5\65\1\103\3\42"+ + "\1\104\1\42\1\46\1\42\27\65\1\73\1\105\2\42"+ + "\3\43\7\42\1\44\5\106\10\42\1\106\1\107\1\106"+ + "\1\110\1\111\3\106\1\112\3\106\1\113\1\114\1\115"+ + "\1\106\1\116\1\117\5\106\1\42\1\105\2\42\3\43"+ + "\1\120\6\42\1\44\5\121\1\42\1\122\1\123\1\124"+ + "\1\125\1\42\1\46\1\42\27\121\1\42\1\105\2\42"+ + "\3\43\3\42\1\126\1\54\1\42\1\55\1\42\5\56"+ + "\6\42\1\127\1\42\27\56\4\42\3\43\4\42\1\130"+ + "\1\42\1\55\1\42\5\131\10\42\27\131\4\42\3\43"+ + "\1\42\1\132\3\42\1\133\2\42\5\133\1\64\7\42"+ + "\27\133\4\42\3\43\7\42\1\44\5\42\1\134\12\42"+ + "\1\135\1\136\7\42\1\137\13\42\1\74\2\42\3\43"+ + "\7\42\1\44\5\65\1\140\3\42\1\141\1\42\1\46"+ + "\1\42\27\65\1\73\1\142\2\42\3\43\7\42\1\44"+ + "\5\143\10\42\1\143\1\144\1\143\1\145\1\146\3\143"+ + "\1\147\3\143\1\150\1\151\1\152\1\143\1\153\1\154"+ + "\5\143\1\42\1\142\2\42\3\43\1\120\6\42\1\44"+ + "\5\155\1\42\1\156\1\157\1\124\1\125\1\42\1\46"+ + "\1\42\27\155\1\42\1\142\2\42\3\43\3\42\1\160"+ + "\1\54\1\42\1\55\1\42\5\56\6\42\1\161\1\42"+ + "\27\56\4\42\3\43\4\42\1\162\1\42\1\55\1\42"+ + "\5\163\10\42\27\163\4\42\3\43\1\42\1\164\3\42"+ + "\1\165\2\42\5\165\1\64\7\42\27\165\4\42\3\43"+ + "\7\42\1\44\5\65\1\166\3\42\1\167\1\42\1\46"+ + "\1\42\27\65\1\73\1\142\2\42\3\43\7\42\1\44"+ + "\5\170\10\42\1\170\1\171\1\170\1\172\1\173\3\170"+ + "\1\174\3\170\1\175\1\176\1\177\1\170\1\200\1\201"+ + "\5\170\1\42\1\142\2\42\3\43\1\120\6\42\1\44"+ + "\5\202\1\42\1\203\1\204\1\124\1\125\1\42\1\46"+ + "\1\42\27\202\1\42\1\142\2\42\3\43\3\42\1\205"+ + "\1\54\1\42\1\55\1\42\5\56\6\42\1\206\1\42"+ + "\27\56\4\42\3\43\4\42\1\207\1\42\1\55\1\42"+ + "\5\210\10\42\27\210\4\42\3\43\1\42\1\211\3\42"+ + "\1\212\2\42\5\212\1\64\7\42\27\212\4\42\3\43"+ + "\6\42\1\55\1\44\5\65\4\42\1\213\1\42\1\46"+ + "\1\42\27\65\1\73\1\142\2\42\3\43\3\42\1\214"+ + "\1\54\1\42\1\55\1\42\5\56\6\42\1\215\1\42"+ + "\27\56\4\42\3\43\4\42\1\216\1\42\1\55\1\42"+ + "\5\217\10\42\27\217\4\42\3\43\1\42\1\220\3\42"+ + "\1\221\2\42\5\221\1\64\7\42\27\221\4\42\3\43"+ + "\7\42\1\44\5\65\1\42\1\222\6\42\3\65\1\223"+ + "\1\224\22\65\3\42\64\0\3\43\72\0\1\225\104\0"+ + "\1\226\25\0\2\50\2\0\56\50\1\0\2\52\1\0"+ + "\60\52\14\0\5\56\10\0\27\56\17\0\5\61\10\0"+ + "\27\61\3\0\5\227\1\230\20\227\1\231\34\227\11\0"+ + "\1\63\2\0\5\63\10\0\27\63\17\0\5\65\10\0"+ + "\27\65\17\0\5\65\10\0\1\232\26\65\17\0\5\65"+ + "\10\0\15\65\1\233\2\65\1\234\4\65\1\235\1\65"+ + "\17\0\5\65\10\0\4\65\1\236\22\65\17\0\5\100"+ + "\10\0\27\100\3\0\5\237\1\240\20\237\1\241\34\237"+ + "\11\0\1\102\2\0\5\102\10\0\27\102\17\0\5\106"+ + "\10\0\27\106\17\0\5\106\10\0\16\106\1\242\7\106"+ + "\1\243\17\0\5\106\10\0\1\244\3\106\1\245\11\106"+ + "\1\246\10\106\17\0\5\106\10\0\20\106\1\247\6\106"+ + "\17\0\5\106\10\0\15\106\1\250\11\106\17\0\5\106"+ + "\10\0\1\251\26\106\17\0\5\106\10\0\23\106\1\252"+ + "\3\106\17\0\5\106\10\0\1\106\1\253\25\106\17\0"+ + "\5\106\10\0\4\106\1\254\22\106\17\0\5\106\10\0"+ + "\22\106\1\255\4\106\17\0\5\121\10\0\27\121\17\0"+ + "\5\131\10\0\27\131\3\0\5\256\1\257\20\256\1\260"+ + "\34\256\11\0\1\133\2\0\5\133\10\0\27\133\34\0"+ + "\1\261\77\0\1\262\2\0\1\263\46\0\1\264\41\0"+ + "\5\143\10\0\27\143\17\0\5\143\10\0\16\143\1\265"+ + "\7\143\1\266\17\0\5\143\10\0\1\267\3\143\1\270"+ + "\11\143\1\271\10\143\17\0\5\143\10\0\20\143\1\272"+ + "\6\143\17\0\5\143\10\0\15\143\1\273\11\143\17\0"+ + "\5\143\10\0\1\274\26\143\17\0\5\143\10\0\23\143"+ + "\1\275\3\143\17\0\5\143\10\0\1\143\1\276\25\143"+ + "\17\0\5\143\10\0\4\143\1\277\22\143\17\0\5\143"+ + "\10\0\22\143\1\300\4\143\17\0\5\155\10\0\27\155"+ + "\17\0\5\163\10\0\27\163\3\0\5\301\1\302\20\301"+ + "\1\303\34\301\11\0\1\165\2\0\5\165\10\0\27\165"+ + "\17\0\5\170\10\0\27\170\17\0\5\170\10\0\16\170"+ + "\1\304\7\170\1\305\17\0\5\170\10\0\1\306\3\170"+ + "\1\307\11\170\1\310\10\170\17\0\5\170\10\0\20\170"+ + "\1\311\6\170\17\0\5\170\10\0\15\170\1\312\11\170"+ + "\17\0\5\170\10\0\1\313\26\170\17\0\5\170\10\0"+ + "\23\170\1\314\3\170\17\0\5\170\10\0\1\170\1\315"+ + "\25\170\17\0\5\170\10\0\4\170\1\316\22\170\17\0"+ + "\5\170\10\0\22\170\1\317\4\170\17\0\5\202\10\0"+ + "\27\202\17\0\5\210\10\0\27\210\3\0\5\320\1\321"+ + "\20\320\1\322\34\320\11\0\1\212\2\0\5\212\10\0"+ + "\27\212\17\0\5\217\10\0\27\217\3\0\5\323\1\324"+ + "\20\323\1\325\34\323\11\0\1\221\2\0\5\221\10\0"+ + "\27\221\17\0\5\65\10\0\1\326\26\65\17\0\5\65"+ + "\10\0\15\65\1\327\11\65\3\0\2\225\1\0\60\225"+ + "\51\0\1\330\16\0\1\227\5\0\1\227\12\0\1\227"+ + "\3\0\1\227\3\0\1\227\7\0\1\227\2\0\1\227"+ + "\1\0\1\227\1\331\22\0\5\65\10\0\22\65\1\332"+ + "\4\65\17\0\5\65\10\0\23\65\1\333\3\65\17\0"+ + "\5\65\10\0\20\65\1\334\6\65\17\0\5\65\10\0"+ + "\22\65\1\335\4\65\17\0\5\65\10\0\22\65\1\336"+ + "\4\65\10\0\1\237\5\0\1\237\12\0\1\237\3\0"+ + "\1\237\3\0\1\237\7\0\1\237\2\0\1\237\1\0"+ + "\1\237\1\337\22\0\5\106\10\0\16\106\1\340\10\106"+ + "\17\0\5\106\10\0\22\106\1\341\4\106\17\0\5\106"+ + "\10\0\22\106\1\342\4\106\17\0\5\106\10\0\2\106"+ + "\1\343\24\106\17\0\5\106\10\0\23\106\1\344\3\106"+ + "\17\0\5\106\10\0\20\106\1\345\6\106\17\0\5\106"+ + "\10\0\22\106\1\346\4\106\17\0\5\106\10\0\17\106"+ + "\1\347\7\106\17\0\5\106\10\0\13\106\1\350\13\106"+ + "\17\0\5\106\10\0\11\106\1\351\15\106\17\0\5\106"+ + "\10\0\21\106\1\352\5\106\17\0\5\106\10\0\20\106"+ + "\1\353\6\106\10\0\1\256\5\0\1\256\12\0\1\256"+ + "\3\0\1\256\3\0\1\256\7\0\1\256\2\0\1\256"+ + "\1\0\1\256\1\354\61\0\1\355\63\0\1\356\57\0"+ + "\1\357\64\0\1\360\23\0\5\143\10\0\16\143\1\361"+ + "\10\143\17\0\5\143\10\0\22\143\1\362\4\143\17\0"+ + "\5\143\10\0\22\143\1\363\4\143\17\0\5\143\10\0"+ + "\2\143\1\364\24\143\17\0\5\143\10\0\23\143\1\365"+ + "\3\143\17\0\5\143\10\0\20\143\1\366\6\143\17\0"+ + "\5\143\10\0\22\143\1\367\4\143\17\0\5\143\10\0"+ + "\17\143\1\370\7\143\17\0\5\143\10\0\13\143\1\371"+ + "\13\143\17\0\5\143\10\0\11\143\1\372\15\143\17\0"+ + "\5\143\10\0\21\143\1\373\5\143\17\0\5\143\10\0"+ + "\20\143\1\374\6\143\10\0\1\301\5\0\1\301\12\0"+ + "\1\301\3\0\1\301\3\0\1\301\7\0\1\301\2\0"+ + "\1\301\1\0\1\301\1\375\22\0\5\170\10\0\16\170"+ + "\1\376\10\170\17\0\5\170\10\0\22\170\1\377\4\170"+ + "\17\0\5\170\10\0\22\170\1\u0100\4\170\17\0\5\170"+ + "\10\0\2\170\1\u0101\24\170\17\0\5\170\10\0\23\170"+ + "\1\u0102\3\170\17\0\5\170\10\0\20\170\1\u0103\6\170"+ + "\17\0\5\170\10\0\22\170\1\u0104\4\170\17\0\5\170"+ + "\10\0\17\170\1\u0105\7\170\17\0\5\170\10\0\13\170"+ + "\1\u0106\13\170\17\0\5\170\10\0\11\170\1\u0107\15\170"+ + "\17\0\5\170\10\0\21\170\1\u0108\5\170\17\0\5\170"+ + "\10\0\20\170\1\u0109\6\170\10\0\1\320\5\0\1\320"+ + "\12\0\1\320\3\0\1\320\3\0\1\320\7\0\1\320"+ + "\2\0\1\320\1\0\1\320\1\u010a\13\0\1\323\5\0"+ + "\1\323\12\0\1\323\3\0\1\323\3\0\1\323\7\0"+ + "\1\323\2\0\1\323\1\0\1\323\1\u010b\22\0\5\65"+ + "\10\0\22\65\1\u010c\4\65\17\0\5\65\10\0\23\65"+ + "\1\u010d\3\65\60\0\1\u010e\21\0\5\u010f\4\0\12\u010f"+ + "\40\0\5\65\10\0\1\u0110\26\65\17\0\5\65\10\0"+ + "\14\65\1\u0111\12\65\17\0\5\65\10\0\16\65\1\u0112"+ + "\10\65\17\0\5\65\10\0\4\65\1\u0113\22\65\17\0"+ + "\5\65\10\0\7\65\1\u0114\17\65\17\0\5\u0115\4\0"+ + "\12\u0115\40\0\5\106\10\0\13\106\1\u0116\13\106\17\0"+ + "\5\106\10\0\4\106\1\u0117\22\106\17\0\5\106\10\0"+ + "\4\106\1\u0118\22\106\17\0\5\106\10\0\10\106\1\u0119"+ + "\16\106\17\0\5\106\10\0\1\106\1\u011a\25\106\17\0"+ + "\5\106\10\0\16\106\1\u011b\10\106\17\0\2\106\1\u011c"+ + "\1\106\1\u011d\10\0\27\106\17\0\5\106\10\0\13\106"+ + "\1\u011e\13\106\17\0\5\106\10\0\4\106\1\u011f\22\106"+ + "\17\0\5\106\10\0\23\106\1\u0120\3\106\17\0\5\106"+ + "\10\0\10\106\1\u0121\16\106\17\0\5\u0122\4\0\12\u0122"+ + "\55\0\1\u0123\76\0\1\u0124\64\0\1\u0125\53\0\1\u0126"+ + "\36\0\5\143\10\0\13\143\1\u0127\13\143\17\0\5\143"+ + "\10\0\4\143\1\u0128\22\143\17\0\5\143\10\0\4\143"+ + "\1\u0129\22\143\17\0\5\143\10\0\10\143\1\u012a\16\143"+ + "\17\0\5\143\10\0\1\143\1\u012b\25\143\17\0\5\143"+ + "\10\0\16\143\1\u012c\10\143\17\0\2\143\1\u012d\1\143"+ + "\1\u012e\10\0\27\143\17\0\5\143\10\0\13\143\1\u012f"+ + "\13\143\17\0\5\143\10\0\4\143\1\u0130\22\143\17\0"+ + "\5\143\10\0\23\143\1\u0131\3\143\17\0\5\143\10\0"+ + "\10\143\1\u0132\16\143\17\0\5\u0133\4\0\12\u0133\40\0"+ + "\5\170\10\0\13\170\1\u0134\13\170\17\0\5\170\10\0"+ + "\4\170\1\u0135\22\170\17\0\5\170\10\0\4\170\1\u0136"+ + "\22\170\17\0\5\170\10\0\10\170\1\u0137\16\170\17\0"+ + "\5\170\10\0\1\170\1\u0138\25\170\17\0\5\170\10\0"+ + "\16\170\1\u0139\10\170\17\0\2\170\1\u013a\1\170\1\u013b"+ + "\10\0\27\170\17\0\5\170\10\0\13\170\1\u013c\13\170"+ + "\17\0\5\170\10\0\4\170\1\u013d\22\170\17\0\5\170"+ + "\10\0\23\170\1\u013e\3\170\17\0\5\170\10\0\10\170"+ + "\1\u013f\16\170\17\0\5\u0140\4\0\12\u0140\40\0\5\u0141"+ + "\4\0\12\u0141\40\0\5\65\10\0\1\u0142\26\65\17\0"+ + "\5\65\10\0\14\65\1\u0143\12\65\44\0\1\u0144\35\0"+ + "\5\u0145\4\0\12\u0145\40\0\5\65\10\0\20\65\1\u0146"+ + "\6\65\17\0\5\65\10\0\20\65\1\u0147\6\65\17\0"+ + "\5\65\10\0\16\65\1\u0148\10\65\17\0\5\u0149\4\0"+ + "\12\u0149\40\0\5\106\10\0\4\106\1\u014a\22\106\17\0"+ + "\5\106\10\0\21\106\1\u014b\5\106\17\0\5\106\10\0"+ + "\22\106\1\u014c\4\106\17\0\5\106\10\0\14\106\1\u014d"+ + "\12\106\17\0\5\106\10\0\13\106\1\u014e\13\106\17\0"+ + "\5\106\10\0\20\106\1\u014f\6\106\17\0\1\106\1\u0150"+ + "\3\106\10\0\27\106\17\0\3\106\1\u0151\1\106\10\0"+ + "\27\106\17\0\5\106\10\0\1\u0152\26\106\17\0\5\106"+ + "\10\0\2\106\1\u0153\24\106\17\0\5\106\10\0\13\106"+ + "\1\u0154\13\106\17\0\5\106\10\0\15\106\1\u0155\11\106"+ + "\17\0\5\u0156\4\0\12\u0156\75\0\1\u0157\60\0\1\u0158"+ + "\27\0\5\143\10\0\4\143\1\u0159\22\143\17\0\5\143"+ + "\10\0\21\143\1\u015a\5\143\17\0\5\143\10\0\22\143"+ + "\1\u015b\4\143\17\0\5\143\10\0\14\143\1\u015c\12\143"+ + "\17\0\5\143\10\0\13\143\1\u015d\13\143\17\0\5\143"+ + "\10\0\20\143\1\u015e\6\143\17\0\1\143\1\u015f\3\143"+ + "\10\0\27\143\17\0\3\143\1\u0160\1\143\10\0\27\143"+ + "\17\0\5\143\10\0\1\u0161\26\143\17\0\5\143\10\0"+ + "\2\143\1\u0162\24\143\17\0\5\143\10\0\13\143\1\u0163"+ + "\13\143\17\0\5\143\10\0\15\143\1\u0164\11\143\17\0"+ + "\5\u0165\4\0\12\u0165\40\0\5\170\10\0\4\170\1\u0166"+ + "\22\170\17\0\5\170\10\0\21\170\1\u0167\5\170\17\0"+ + "\5\170\10\0\22\170\1\u0168\4\170\17\0\5\170\10\0"+ + "\14\170\1\u0169\12\170\17\0\5\170\10\0\13\170\1\u016a"+ + "\13\170\17\0\5\170\10\0\20\170\1\u016b\6\170\17\0"+ + "\1\170\1\u016c\3\170\10\0\27\170\17\0\3\170\1\u016d"+ + "\1\170\10\0\27\170\17\0\5\170\10\0\1\u016e\26\170"+ + "\17\0\5\170\10\0\2\170\1\u016f\24\170\17\0\5\170"+ + "\10\0\13\170\1\u0170\13\170\17\0\5\170\10\0\15\170"+ + "\1\u0171\11\170\17\0\5\u0172\4\0\12\u0172\40\0\5\u0173"+ + "\4\0\12\u0173\57\0\1\u0174\43\0\5\u0175\4\0\12\u0175"+ + "\40\0\5\65\10\0\21\65\1\u0176\5\65\17\0\5\65"+ + "\10\0\15\65\1\u0177\11\65\17\0\5\65\10\0\3\65"+ + "\1\u0178\23\65\17\0\5\u0179\4\0\12\u0179\40\0\5\106"+ + "\10\0\1\u017a\26\106\17\0\5\106\10\0\10\106\1\u017b"+ + "\16\106\17\0\5\106\10\0\1\u017c\26\106\17\0\5\106"+ + "\10\0\4\106\1\u017d\22\106\17\0\5\106\10\0\1\106"+ + "\1\u017e\25\106\17\0\5\106\10\0\22\106\1\u017f\4\106"+ + "\17\0\5\106\10\0\22\106\1\u0180\4\106\17\0\5\106"+ + "\10\0\6\106\1\u0181\20\106\17\0\5\u0182\4\0\12\u0182"+ + "\76\0\1\u0183\44\0\1\u0184\42\0\5\143\10\0\1\u0185"+ + "\26\143\17\0\5\143\10\0\10\143\1\u0186\16\143\17\0"+ + "\5\143\10\0\1\u0187\26\143\17\0\5\143\10\0\4\143"+ + "\1\u0188\22\143\17\0\5\143\10\0\1\143\1\u0189\25\143"+ + "\17\0\5\143\10\0\22\143\1\u018a\4\143\17\0\5\143"+ + "\10\0\22\143\1\u018b\4\143\17\0\5\143\10\0\6\143"+ + "\1\u018c\20\143\17\0\5\u018d\4\0\12\u018d\40\0\5\170"+ + "\10\0\1\u018e\26\170\17\0\5\170\10\0\10\170\1\u018f"+ + "\16\170\17\0\5\170\10\0\1\u0190\26\170\17\0\5\170"+ + "\10\0\4\170\1\u0191\22\170\17\0\5\170\10\0\1\170"+ + "\1\u0192\25\170\17\0\5\170\10\0\22\170\1\u0193\4\170"+ + "\17\0\5\170\10\0\22\170\1\u0194\4\170\17\0\5\170"+ + "\10\0\6\170\1\u0195\20\170\17\0\5\u0196\4\0\12\u0196"+ + "\40\0\5\u0197\4\0\12\u0197\61\0\1\u0198\41\0\5\227"+ + "\4\0\12\227\40\0\5\237\4\0\12\237\40\0\5\106"+ + "\10\0\15\106\1\u0199\11\106\17\0\5\106\10\0\14\106"+ + "\1\u019a\12\106\17\0\5\106\10\0\13\106\1\u019b\13\106"+ + "\17\0\5\106\10\0\13\106\1\u019c\13\106\17\0\5\256"+ + "\4\0\12\256\40\0\5\143\10\0\15\143\1\u019d\11\143"+ + "\17\0\5\143\10\0\14\143\1\u019e\12\143\17\0\5\143"+ + "\10\0\13\143\1\u019f\13\143\17\0\5\143\10\0\13\143"+ + "\1\u01a0\13\143\17\0\5\301\4\0\12\301\40\0\5\170"+ + "\10\0\15\170\1\u01a1\11\170\17\0\5\170\10\0\14\170"+ + "\1\u01a2\12\170\17\0\5\170\10\0\13\170\1\u01a3\13\170"+ + "\17\0\5\170\10\0\13\170\1\u01a4\13\170\17\0\5\320"+ + "\4\0\12\320\40\0\5\323\4\0\12\323\40\0\5\106"+ + "\10\0\4\106\1\u01a5\22\106\17\0\5\106\10\0\4\106"+ + "\1\u01a6\22\106\17\0\5\143\10\0\4\143\1\u01a7\22\143"+ + "\17\0\5\143\10\0\4\143\1\u01a8\22\143\17\0\5\170"+ + "\10\0\4\170\1\u01a9\22\170\17\0\5\170\10\0\4\170"+ + "\1\u01aa\22\170\3\0"; private static int [] zzUnpacktrans() { int [] result = new int[16065]; @@ -568,7 +568,7 @@ private static int zzUnpacktrans(String packed, int offset, int [] result) { private static final String ZZ_ATTRIBUTE_PACKED_0 = "\41\0\1\11\2\1\2\11\2\1\1\11\1\1\3\11"+ - "\1\1\2\11\3\1\1\11\1\1\1\11\3\1\5\11"+ + "\1\1\2\11\3\1\1\11\1\1\2\11\3\1\5\11"+ "\3\1\3\11\12\1\1\11\1\1\7\11\3\1\1\11"+ "\3\1\3\11\13\1\5\11\3\1\2\11\13\1\5\11"+ "\3\1\4\11\3\1\1\11\3\1\2\0\1\11\1\0"+ @@ -582,7 +582,7 @@ private static int zzUnpacktrans(String packed, int offset, int [] result) { "\1\0\10\1\2\0\1\11\22\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[425]; + int [] result = new int[426]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -651,7 +651,7 @@ the source of the yytext() string */ /* user code: */ public _FsdLexer() { - this(null); + this((java.io.Reader)null); } @@ -900,592 +900,597 @@ else if (zzAtEOF) { { return BAD_CHARACTER; } // fall through - case 119: break; + case 120: break; case 2: { return WHITE_SPACE; } // fall through - case 120: break; + case 121: break; case 3: { yybegin(SERVICE_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 121: break; + case 122: break; case 4: { return RIGHT_BRACKET; } // fall through - case 122: break; + case 123: break; case 5: { return MARKDOWNTEXT; } // fall through - case 123: break; + case 124: break; case 6: { return MARKDOWNHEADING; } // fall through - case 124: break; + case 125: break; case 7: { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 125: break; + case 126: break; case 8: { return RIGHT_PAREN; } // fall through - case 126: break; + case 127: break; case 9: { return COMMA; } // fall through - case 127: break; + case 128: break; case 10: { return ATTRIBUTENAME; } // fall through - case 128: break; + case 129: break; case 11: { yybegin(YYINITIAL); return RIGHT_BRACKET; } // fall through - case 129: break; + case 130: break; case 12: { yybegin(SERVICE_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 130: break; + case 131: break; case 13: { yybegin(SERVICE_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 131: break; + case 132: break; case 14: { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 132: break; + case 133: break; case 15: { return COLON; } // fall through - case 133: break; + case 134: break; case 16: { return IDENTIFIER; } // fall through - case 134: break; + case 135: break; case 17: - { yybegin(SERVICE_BODY_ATTRIBUTE); return LEFT_BRACKET; + { return SEMI; } // fall through - case 135: break; + case 136: break; case 18: - { return LEFT_BRACE; + { yybegin(SERVICE_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 136: break; + case 137: break; case 19: - { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; + { return LEFT_BRACE; } // fall through - case 137: break; + case 138: break; case 20: - { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; + { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } // fall through - case 138: break; + case 139: break; case 21: - { yybegin(SERVICE_BODY); return RIGHT_BRACKET; + { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 139: break; + case 140: break; case 22: - { yybegin(SERVICE_BODY_ATTRIBUTE); return RIGHT_PAREN; + { yybegin(SERVICE_BODY); return RIGHT_BRACKET; } // fall through - case 140: break; + case 141: break; case 23: - { yybegin(SERVICE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; + { yybegin(SERVICE_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 141: break; + case 142: break; case 24: - { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; + { yybegin(SERVICE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 142: break; + case 143: break; case 25: - { yybegin(METHOD_BODY_TYPE); return COLON; + { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 143: break; + case 144: break; case 26: - { yybegin(METHOD_BODY_ATTRIBUTE); return LEFT_BRACKET; + { yybegin(METHOD_BODY_TYPE); return COLON; } // fall through - case 144: break; + case 145: break; case 27: - { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; + { yybegin(METHOD_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 145: break; + case 146: break; case 28: - { yybegin(METHOD_BODY_TYPE_END); return TYPENAME; + { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } // fall through - case 146: break; + case 147: break; case 29: - { return BANG; + { yybegin(METHOD_BODY_TYPE_END); return TYPENAME; } // fall through - case 147: break; + case 148: break; case 30: - { yybegin(METHOD_BODY); return IDENTIFIER; + { return BANG; } // fall through - case 148: break; + case 149: break; case 31: - { yybegin(METHOD_BODY); return SEMI; + { yybegin(METHOD_BODY); return IDENTIFIER; } // fall through - case 149: break; + case 150: break; case 32: - { yybegin(METHOD_BODY_TYPE); return LEFT_ANGLE; + { yybegin(METHOD_BODY); return SEMI; } // fall through - case 150: break; + case 151: break; case 33: - { return RIGHT_ANGLE; + { yybegin(METHOD_BODY_TYPE); return LEFT_ANGLE; } // fall through - case 151: break; + case 152: break; case 34: - { return LEFT_BRACKET; + { return RIGHT_ANGLE; } // fall through - case 152: break; + case 153: break; case 35: - { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; + { return LEFT_BRACKET; } // fall through - case 153: break; + case 154: break; case 36: - { yybegin(METHOD_BODY); return RIGHT_BRACKET; + { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 154: break; + case 155: break; case 37: - { yybegin(METHOD_BODY_ATTRIBUTE); return RIGHT_PAREN; + { yybegin(METHOD_BODY); return RIGHT_BRACKET; } // fall through - case 155: break; + case 156: break; case 38: - { yybegin(METHOD_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; + { yybegin(METHOD_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 156: break; + case 157: break; case 39: - { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; + { yybegin(METHOD_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 157: break; + case 158: break; case 40: - { yybegin(RESPONSE_BODY); return COLON; + { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 158: break; + case 159: break; case 41: - { yybegin(RESPONSE_BODY_TYPE); return COLON; + { yybegin(RESPONSE_BODY); return COLON; } // fall through - case 159: break; + case 160: break; case 42: - { yybegin(RESPONSE_BODY_ATTRIBUTE); return LEFT_BRACKET; + { yybegin(RESPONSE_BODY_TYPE); return COLON; } // fall through - case 160: break; + case 161: break; case 43: - { yybegin(SERVICE_BODY); return RIGHT_BRACE; + { yybegin(RESPONSE_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 161: break; + case 162: break; case 44: - { yybegin(RESPONSE_BODY_TYPE_END); return TYPENAME; + { yybegin(SERVICE_BODY); return RIGHT_BRACE; } // fall through - case 162: break; + case 163: break; case 45: - { yybegin(RESPONSE_BODY); return IDENTIFIER; + { yybegin(RESPONSE_BODY_TYPE_END); return TYPENAME; } // fall through - case 163: break; + case 164: break; case 46: - { yybegin(RESPONSE_BODY); return SEMI; + { yybegin(RESPONSE_BODY); return IDENTIFIER; } // fall through - case 164: break; + case 165: break; case 47: - { yybegin(RESPONSE_BODY_TYPE); return LEFT_ANGLE; + { yybegin(RESPONSE_BODY); return SEMI; } // fall through - case 165: break; + case 166: break; case 48: - { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; + { yybegin(RESPONSE_BODY_TYPE); return LEFT_ANGLE; } // fall through - case 166: break; + case 167: break; case 49: - { yybegin(RESPONSE_BODY); return RIGHT_BRACKET; + { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 167: break; + case 168: break; case 50: - { yybegin(RESPONSE_BODY_ATTRIBUTE); return RIGHT_PAREN; + { yybegin(RESPONSE_BODY); return RIGHT_BRACKET; } // fall through - case 168: break; + case 169: break; case 51: - { yybegin(RESPONSE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; + { yybegin(RESPONSE_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 169: break; + case 170: break; case 52: - { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; + { yybegin(RESPONSE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 170: break; + case 171: break; case 53: - { yybegin(DATA_BODY_TYPE); return COLON; + { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 171: break; + case 172: break; case 54: - { yybegin(DATA_BODY_ATTRIBUTE); return LEFT_BRACKET; + { yybegin(DATA_BODY_TYPE); return COLON; } // fall through - case 172: break; + case 173: break; case 55: - { yybegin(DATA_BODY_TYPE_END); return TYPENAME; + { yybegin(DATA_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 173: break; + case 174: break; case 56: - { yybegin(DATA_BODY); return IDENTIFIER; + { yybegin(DATA_BODY_TYPE_END); return TYPENAME; } // fall through - case 174: break; + case 175: break; case 57: - { yybegin(DATA_BODY); return SEMI; + { yybegin(DATA_BODY); return IDENTIFIER; } // fall through - case 175: break; + case 176: break; case 58: - { yybegin(DATA_BODY_TYPE); return LEFT_ANGLE; + { yybegin(DATA_BODY); return SEMI; } // fall through - case 176: break; + case 177: break; case 59: - { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; + { yybegin(DATA_BODY_TYPE); return LEFT_ANGLE; } // fall through - case 177: break; + case 178: break; case 60: - { yybegin(DATA_BODY); return RIGHT_BRACKET; + { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 178: break; + case 179: break; case 61: - { yybegin(DATA_BODY_ATTRIBUTE); return RIGHT_PAREN; + { yybegin(DATA_BODY); return RIGHT_BRACKET; } // fall through - case 179: break; + case 180: break; case 62: - { yybegin(DATA_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; + { yybegin(DATA_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 180: break; + case 181: break; case 63: - { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; + { yybegin(DATA_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 181: break; + case 182: break; case 64: - { yybegin(LIST_BODY_ATTRIBUTE); return LEFT_BRACKET; + { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 182: break; + case 183: break; case 65: - { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; + { yybegin(LIST_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 183: break; + case 184: break; case 66: - { yybegin(LIST_BODY); return RIGHT_BRACKET; + { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 184: break; + case 185: break; case 67: - { yybegin(LIST_BODY_ATTRIBUTE); return RIGHT_PAREN; + { yybegin(LIST_BODY); return RIGHT_BRACKET; } // fall through - case 185: break; + case 186: break; case 68: - { yybegin(LIST_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; + { yybegin(LIST_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 186: break; + case 187: break; case 69: - { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; + { yybegin(LIST_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 187: break; + case 188: break; case 70: - { yybegin(SERVICE_BODY); return SEMI; + { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 188: break; + case 189: break; case 71: - { return COMMENT; + { yybegin(SERVICE_BODY); return SEMI; } // fall through - case 189: break; + case 190: break; case 72: - { yybegin(METHOD_BODY_TYPE_END); return MAP; + { return COMMENT; } // fall through - case 190: break; + case 191: break; case 73: - { yybegin(RESPONSE_BODY_TYPE_END); return MAP; + { yybegin(METHOD_BODY_TYPE_END); return MAP; } // fall through - case 191: break; + case 192: break; case 74: - { yybegin(DATA_BODY_TYPE_END); return MAP; + { yybegin(RESPONSE_BODY_TYPE_END); return MAP; } // fall through - case 192: break; + case 193: break; case 75: - { yybegin(DATA_BODY); return DATA; + { yybegin(DATA_BODY_TYPE_END); return MAP; } // fall through - case 193: break; + case 194: break; case 76: - { yybegin(LIST_BODY); return ENUM; + { yybegin(DATA_BODY); return DATA; } // fall through - case 194: break; + case 195: break; case 77: - { return DATA; + { yybegin(LIST_BODY); return ENUM; } // fall through - case 195: break; + case 196: break; case 78: - { return ENUM; + { return DATA; } // fall through - case 196: break; + case 197: break; case 79: - { yybegin(METHOD_BODY_TYPE_END); return BYTES; + { return ENUM; } // fall through - case 197: break; + case 198: break; case 80: - { yybegin(METHOD_BODY_TYPE_END); return ERROR; + { yybegin(METHOD_BODY_TYPE_END); return BYTES; } // fall through - case 198: break; + case 199: break; case 81: - { yybegin(METHOD_BODY_TYPE_END); return INT32; + { yybegin(METHOD_BODY_TYPE_END); return ERROR; } // fall through - case 199: break; + case 200: break; case 82: - { yybegin(METHOD_BODY_TYPE_END); return INT64; + { yybegin(METHOD_BODY_TYPE_END); return INT32; } // fall through - case 200: break; + case 201: break; case 83: - { yybegin(RESPONSE_BODY_TYPE_END); return BYTES; + { yybegin(METHOD_BODY_TYPE_END); return INT64; } // fall through - case 201: break; + case 202: break; case 84: - { yybegin(RESPONSE_BODY_TYPE_END); return ERROR; + { yybegin(RESPONSE_BODY_TYPE_END); return BYTES; } // fall through - case 202: break; + case 203: break; case 85: - { yybegin(RESPONSE_BODY_TYPE_END); return INT32; + { yybegin(RESPONSE_BODY_TYPE_END); return ERROR; } // fall through - case 203: break; + case 204: break; case 86: - { yybegin(RESPONSE_BODY_TYPE_END); return INT64; + { yybegin(RESPONSE_BODY_TYPE_END); return INT32; } // fall through - case 204: break; + case 205: break; case 87: - { yybegin(DATA_BODY_TYPE_END); return BYTES; + { yybegin(RESPONSE_BODY_TYPE_END); return INT64; } // fall through - case 205: break; + case 206: break; case 88: - { yybegin(DATA_BODY_TYPE_END); return ERROR; + { yybegin(DATA_BODY_TYPE_END); return BYTES; } // fall through - case 206: break; + case 207: break; case 89: - { yybegin(DATA_BODY_TYPE_END); return INT32; + { yybegin(DATA_BODY_TYPE_END); return ERROR; } // fall through - case 207: break; + case 208: break; case 90: - { yybegin(DATA_BODY_TYPE_END); return INT64; + { yybegin(DATA_BODY_TYPE_END); return INT32; } // fall through - case 208: break; + case 209: break; case 91: - { yybegin(LIST_BODY); return ERRORS; + { yybegin(DATA_BODY_TYPE_END); return INT64; } // fall through - case 209: break; + case 210: break; case 92: - { yybegin(EXTERN_DECL); return EXTERN; + { yybegin(LIST_BODY); return ERRORS; } // fall through - case 210: break; + case 211: break; case 93: - { yybegin(METHOD_BODY); return METHOD; + { yybegin(EXTERN_DECL); return EXTERN; } // fall through - case 211: break; + case 212: break; case 94: - { yybegin(METHOD_BODY_TYPE_END); return DOUBLE; + { yybegin(METHOD_BODY); return METHOD; } // fall through - case 212: break; + case 213: break; case 95: - { yybegin(METHOD_BODY_TYPE_END); return OBJECT; + { yybegin(METHOD_BODY_TYPE_END); return DOUBLE; } // fall through - case 213: break; + case 214: break; case 96: - { yybegin(METHOD_BODY_TYPE_END); return RESULT; + { yybegin(METHOD_BODY_TYPE_END); return OBJECT; } // fall through - case 214: break; + case 215: break; case 97: - { yybegin(METHOD_BODY_TYPE_END); return STRING; + { yybegin(METHOD_BODY_TYPE_END); return RESULT; } // fall through - case 215: break; + case 216: break; case 98: - { yybegin(RESPONSE_BODY_TYPE_END); return DOUBLE; + { yybegin(METHOD_BODY_TYPE_END); return STRING; } // fall through - case 216: break; + case 217: break; case 99: - { yybegin(RESPONSE_BODY_TYPE_END); return OBJECT; + { yybegin(RESPONSE_BODY_TYPE_END); return DOUBLE; } // fall through - case 217: break; + case 218: break; case 100: - { yybegin(RESPONSE_BODY_TYPE_END); return RESULT; + { yybegin(RESPONSE_BODY_TYPE_END); return OBJECT; } // fall through - case 218: break; + case 219: break; case 101: - { yybegin(RESPONSE_BODY_TYPE_END); return STRING; + { yybegin(RESPONSE_BODY_TYPE_END); return RESULT; } // fall through - case 219: break; + case 220: break; case 102: - { yybegin(DATA_BODY_TYPE_END); return DOUBLE; + { yybegin(RESPONSE_BODY_TYPE_END); return STRING; } // fall through - case 220: break; + case 221: break; case 103: - { yybegin(DATA_BODY_TYPE_END); return OBJECT; + { yybegin(DATA_BODY_TYPE_END); return DOUBLE; } // fall through - case 221: break; + case 222: break; case 104: - { yybegin(DATA_BODY_TYPE_END); return RESULT; + { yybegin(DATA_BODY_TYPE_END); return OBJECT; } // fall through - case 222: break; + case 223: break; case 105: - { yybegin(DATA_BODY_TYPE_END); return STRING; + { yybegin(DATA_BODY_TYPE_END); return RESULT; } // fall through - case 223: break; + case 224: break; case 106: - { yybegin(SERVICE_BODY); return SERVICE; + { yybegin(DATA_BODY_TYPE_END); return STRING; } // fall through - case 224: break; + case 225: break; case 107: - { yybegin(METHOD_BODY_TYPE_END); return BOOLEAN; + { yybegin(SERVICE_BODY); return SERVICE; } // fall through - case 225: break; + case 226: break; case 108: - { yybegin(METHOD_BODY_TYPE_END); return DECIMAL; + { yybegin(METHOD_BODY_TYPE_END); return BOOLEAN; } // fall through - case 226: break; + case 227: break; case 109: - { yybegin(RESPONSE_BODY_TYPE_END); return BOOLEAN; + { yybegin(METHOD_BODY_TYPE_END); return DECIMAL; } // fall through - case 227: break; + case 228: break; case 110: - { yybegin(RESPONSE_BODY_TYPE_END); return DECIMAL; + { yybegin(RESPONSE_BODY_TYPE_END); return BOOLEAN; } // fall through - case 228: break; + case 229: break; case 111: - { yybegin(DATA_BODY_TYPE_END); return BOOLEAN; + { yybegin(RESPONSE_BODY_TYPE_END); return DECIMAL; } // fall through - case 229: break; + case 230: break; case 112: - { yybegin(DATA_BODY_TYPE_END); return DECIMAL; + { yybegin(DATA_BODY_TYPE_END); return BOOLEAN; } // fall through - case 230: break; + case 231: break; case 113: - { yybegin(METHOD_BODY_TYPE_END); return DATETIME; + { yybegin(DATA_BODY_TYPE_END); return DECIMAL; } // fall through - case 231: break; + case 232: break; case 114: - { yybegin(METHOD_BODY_TYPE_END); return NULLABLE; + { yybegin(METHOD_BODY_TYPE_END); return DATETIME; } // fall through - case 232: break; + case 233: break; case 115: - { yybegin(RESPONSE_BODY_TYPE_END); return DATETIME; + { yybegin(METHOD_BODY_TYPE_END); return NULLABLE; } // fall through - case 233: break; + case 234: break; case 116: - { yybegin(RESPONSE_BODY_TYPE_END); return NULLABLE; + { yybegin(RESPONSE_BODY_TYPE_END); return DATETIME; } // fall through - case 234: break; + case 235: break; case 117: - { yybegin(DATA_BODY_TYPE_END); return DATETIME; + { yybegin(RESPONSE_BODY_TYPE_END); return NULLABLE; } // fall through - case 235: break; + case 236: break; case 118: + { yybegin(DATA_BODY_TYPE_END); return DATETIME; + } + // fall through + case 237: break; + case 119: { yybegin(DATA_BODY_TYPE_END); return NULLABLE; } // fall through - case 236: break; + case 238: break; default: zzScanError(ZZ_NO_MATCH); } diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index bad4315..9ae96fd 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -787,7 +787,7 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item + // ('{' decorated_service_item* '}') | (';' decorated_service_item*) | decorated_service_item public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index d3337b2..5204843 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -43,7 +43,7 @@ definition ::= (attribute_list* service_spec) markdown_remarks* service_spec ::= service identifier service_items { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | ';' decorated_service_item* | decorated_service_item +service_items ::= ('{' decorated_service_item* '}') | (';' decorated_service_item*) | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method) diff --git a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex index bb69d2d..e048727 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex +++ b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex @@ -88,6 +88,7 @@ MARKDOWN_TEXT=.+ "errors" { yybegin(LIST_BODY); return ERRORS; } "enum" { yybegin(LIST_BODY); return ENUM; } + ";" { return SEMI; } "{" { return LEFT_BRACE; } "}" { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } "[" { yybegin(SERVICE_BODY_ATTRIBUTE); return LEFT_BRACKET; } From 4d030129304d60a86ae0770351909312a05d77e3 Mon Sep 17 00:00:00 2001 From: bryankenote Date: Thu, 2 Jan 2025 15:10:12 -0800 Subject: [PATCH 07/11] begin markdown section when a hashtag is found after whitespace --- .../facilityapi/intellij/lexer/_FsdLexer.java | 1002 +++++++++-------- .../facilityapi/intellij/lexer/_FsdLexer.flex | 1 + 2 files changed, 506 insertions(+), 497 deletions(-) diff --git a/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java b/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java index ce06e7c..08a65ff 100644 --- a/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java +++ b/src/main/gen/io/github/facilityapi/intellij/lexer/_FsdLexer.java @@ -142,34 +142,34 @@ private static int zzUnpackcmap_blocks(String packed, int offset, int [] result) private static final String ZZ_ACTION_PACKED_0 = "\41\0\1\1\1\2\1\1\1\3\1\4\1\1\1\5"+ "\1\2\1\6\1\7\1\10\1\11\1\12\1\13\1\14"+ - "\1\15\1\1\1\16\1\17\1\20\1\21\1\22\3\20"+ - "\1\23\1\24\1\25\1\26\1\27\1\30\1\1\1\31"+ - "\1\32\1\33\1\34\12\35\1\36\1\37\1\40\1\41"+ - "\1\42\1\43\1\44\1\45\1\46\1\47\1\1\1\50"+ - "\1\51\3\1\1\52\1\53\1\54\12\55\1\56\1\57"+ - "\1\60\1\61\1\62\1\63\1\64\1\1\1\65\1\66"+ - "\1\67\12\70\1\71\1\72\1\73\1\74\1\75\1\76"+ - "\1\77\1\1\1\100\1\101\1\102\1\103\1\104\1\105"+ - "\1\1\1\106\1\107\2\20\1\110\2\0\1\16\1\0"+ - "\5\20\1\0\1\31\1\0\14\35\1\0\1\50\5\0"+ - "\14\55\1\0\1\65\1\0\14\70\1\0\1\100\2\0"+ - "\1\106\1\0\2\20\2\0\5\20\1\0\7\35\1\111"+ - "\4\35\5\0\7\55\1\112\4\55\1\0\7\70\1\113"+ - "\4\70\2\0\2\20\2\0\1\114\1\115\3\20\1\0"+ - "\14\35\1\0\1\114\1\115\2\0\14\55\1\0\14\70"+ - "\2\0\1\116\1\117\2\0\3\20\1\0\1\35\1\120"+ - "\3\35\1\121\1\122\1\123\4\35\3\0\1\55\1\124"+ - "\3\55\1\125\1\126\1\127\4\55\1\0\1\70\1\130"+ - "\3\70\1\131\1\132\1\133\4\70\4\0\1\134\1\135"+ - "\1\136\1\0\3\35\1\137\1\35\1\140\1\141\1\142"+ - "\1\0\1\134\1\136\3\55\1\143\1\55\1\144\1\145"+ - "\1\146\1\0\3\70\1\147\1\70\1\150\1\151\1\152"+ - "\2\0\1\153\1\154\1\35\1\155\1\35\1\156\1\55"+ - "\1\157\1\55\1\160\1\70\1\161\1\70\1\162\1\163"+ - "\1\164\1\165\1\166\1\167"; + "\1\15\1\1\1\16\1\17\1\2\1\20\1\21\1\22"+ + "\3\20\1\23\1\24\1\25\1\26\1\27\1\30\1\1"+ + "\1\31\1\32\1\33\1\34\12\35\1\36\1\37\1\40"+ + "\1\41\1\42\1\43\1\44\1\45\1\46\1\47\1\1"+ + "\1\50\1\51\3\1\1\52\1\53\1\54\12\55\1\56"+ + "\1\57\1\60\1\61\1\62\1\63\1\64\1\1\1\65"+ + "\1\66\1\67\12\70\1\71\1\72\1\73\1\74\1\75"+ + "\1\76\1\77\1\1\1\100\1\101\1\102\1\103\1\104"+ + "\1\105\1\1\1\106\1\107\2\20\1\110\2\0\1\16"+ + "\1\0\1\111\5\20\1\0\1\31\1\0\14\35\1\0"+ + "\1\50\5\0\14\55\1\0\1\65\1\0\14\70\1\0"+ + "\1\100\2\0\1\106\1\0\2\20\2\0\5\20\1\0"+ + "\7\35\1\112\4\35\5\0\7\55\1\113\4\55\1\0"+ + "\7\70\1\114\4\70\2\0\2\20\2\0\1\115\1\116"+ + "\3\20\1\0\14\35\1\0\1\115\1\116\2\0\14\55"+ + "\1\0\14\70\2\0\1\117\1\120\2\0\3\20\1\0"+ + "\1\35\1\121\3\35\1\122\1\123\1\124\4\35\3\0"+ + "\1\55\1\125\3\55\1\126\1\127\1\130\4\55\1\0"+ + "\1\70\1\131\3\70\1\132\1\133\1\134\4\70\4\0"+ + "\1\135\1\136\1\137\1\0\3\35\1\140\1\35\1\141"+ + "\1\142\1\143\1\0\1\135\1\137\3\55\1\144\1\55"+ + "\1\145\1\146\1\147\1\0\3\70\1\150\1\70\1\151"+ + "\1\152\1\153\2\0\1\154\1\155\1\35\1\156\1\35"+ + "\1\157\1\55\1\160\1\55\1\161\1\70\1\162\1\70"+ + "\1\163\1\164\1\165\1\166\1\167\1\170"; private static int [] zzUnpackAction() { - int [] result = new int[426]; + int [] result = new int[428]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -200,57 +200,57 @@ private static int zzUnpackAction(String packed, int offset, int [] result) { "\0\u04c8\0\u04fb\0\u052e\0\u0561\0\u0594\0\u05c7\0\u05fa\0\u062d"+ "\0\u0660\0\u0693\0\u06c6\0\u06f9\0\u0693\0\u0693\0\u072c\0\u075f"+ "\0\u0693\0\u0792\0\u0693\0\u0693\0\u0693\0\u07c5\0\u0693\0\u0693"+ - "\0\u07f8\0\u082b\0\u085e\0\u0693\0\u0891\0\u0693\0\u0693\0\u08c4"+ - "\0\u08f7\0\u092a\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u095d"+ - "\0\u0990\0\u09c3\0\u0693\0\u0693\0\u0693\0\u09f6\0\u0a29\0\u0a5c"+ - "\0\u0a8f\0\u0ac2\0\u0af5\0\u0b28\0\u0b5b\0\u0b8e\0\u0bc1\0\u0693"+ - "\0\u0bf4\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693"+ - "\0\u0c27\0\u0c5a\0\u0c8d\0\u0693\0\u0cc0\0\u0cf3\0\u0d26\0\u0693"+ - "\0\u0693\0\u0693\0\u0d59\0\u0d8c\0\u0dbf\0\u0df2\0\u0e25\0\u0e58"+ - "\0\u0e8b\0\u0ebe\0\u0ef1\0\u0f24\0\u0f57\0\u0693\0\u0693\0\u0693"+ - "\0\u0693\0\u0693\0\u0f8a\0\u0fbd\0\u0ff0\0\u0693\0\u0693\0\u1023"+ + "\0\u07f8\0\u082b\0\u085e\0\u0693\0\u0891\0\u08c4\0\u0693\0\u0693"+ + "\0\u08f7\0\u092a\0\u095d\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693"+ + "\0\u0990\0\u09c3\0\u09f6\0\u0693\0\u0693\0\u0693\0\u0a29\0\u0a5c"+ + "\0\u0a8f\0\u0ac2\0\u0af5\0\u0b28\0\u0b5b\0\u0b8e\0\u0bc1\0\u0bf4"+ + "\0\u0693\0\u0c27\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693"+ + "\0\u0693\0\u0c5a\0\u0c8d\0\u0cc0\0\u0693\0\u0cf3\0\u0d26\0\u0d59"+ + "\0\u0693\0\u0693\0\u0693\0\u0d8c\0\u0dbf\0\u0df2\0\u0e25\0\u0e58"+ + "\0\u0e8b\0\u0ebe\0\u0ef1\0\u0f24\0\u0f57\0\u0f8a\0\u0693\0\u0693"+ + "\0\u0693\0\u0693\0\u0693\0\u0fbd\0\u0ff0\0\u1023\0\u0693\0\u0693"+ "\0\u1056\0\u1089\0\u10bc\0\u10ef\0\u1122\0\u1155\0\u1188\0\u11bb"+ - "\0\u11ee\0\u1221\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693\0\u1254"+ - "\0\u1287\0\u12ba\0\u0693\0\u0693\0\u0693\0\u0693\0\u12ed\0\u1320"+ - "\0\u1353\0\u0693\0\u1386\0\u13b9\0\u13ec\0\u141f\0\u082b\0\u0693"+ - "\0\u1452\0\u1485\0\u14b8\0\u14eb\0\u151e\0\u1551\0\u0990\0\u0693"+ - "\0\u1584\0\u15b7\0\u15ea\0\u161d\0\u1650\0\u1683\0\u16b6\0\u16e9"+ - "\0\u171c\0\u174f\0\u1782\0\u17b5\0\u17e8\0\u0c5a\0\u0693\0\u181b"+ - "\0\u184e\0\u1881\0\u18b4\0\u18e7\0\u191a\0\u194d\0\u1980\0\u19b3"+ - "\0\u19e6\0\u1a19\0\u1a4c\0\u1a7f\0\u1ab2\0\u1ae5\0\u1b18\0\u1b4b"+ - "\0\u0fbd\0\u0693\0\u1b7e\0\u1bb1\0\u1be4\0\u1c17\0\u1c4a\0\u1c7d"+ - "\0\u1cb0\0\u1ce3\0\u1d16\0\u1d49\0\u1d7c\0\u1daf\0\u1de2\0\u1287"+ - "\0\u0693\0\u1e15\0\u1320\0\u0693\0\u1e48\0\u1e7b\0\u1eae\0\u1ee1"+ - "\0\u1f14\0\u1f47\0\u1f7a\0\u1fad\0\u1fe0\0\u2013\0\u2046\0\u2079"+ - "\0\u20ac\0\u20df\0\u2112\0\u2145\0\u2178\0\u21ab\0\u09f6\0\u21de"+ - "\0\u2211\0\u2244\0\u2277\0\u22aa\0\u22dd\0\u2310\0\u2343\0\u2376"+ - "\0\u23a9\0\u23dc\0\u240f\0\u2442\0\u2475\0\u24a8\0\u24db\0\u0d59"+ - "\0\u250e\0\u2541\0\u2574\0\u25a7\0\u25da\0\u260d\0\u2640\0\u2673"+ - "\0\u26a6\0\u26d9\0\u270c\0\u273f\0\u1023\0\u2772\0\u27a5\0\u27d8"+ - "\0\u280b\0\u283e\0\u2871\0\u28a4\0\u28d7\0\u290a\0\u293d\0\u0891"+ - "\0\u0891\0\u2970\0\u29a3\0\u29d6\0\u2a09\0\u2a3c\0\u2a6f\0\u2aa2"+ - "\0\u2ad5\0\u2b08\0\u2b3b\0\u2b6e\0\u2ba1\0\u2bd4\0\u2c07\0\u2c3a"+ - "\0\u2c6d\0\u2ca0\0\u0693\0\u0693\0\u2cd3\0\u2d06\0\u2d39\0\u2d6c"+ - "\0\u2d9f\0\u2dd2\0\u2e05\0\u2e38\0\u2e6b\0\u2e9e\0\u2ed1\0\u2f04"+ - "\0\u2f37\0\u2f6a\0\u2f9d\0\u2fd0\0\u3003\0\u3036\0\u3069\0\u309c"+ - "\0\u30cf\0\u3102\0\u3135\0\u3168\0\u319b\0\u31ce\0\u3201\0\u3234"+ - "\0\u3267\0\u0891\0\u0891\0\u329a\0\u32cd\0\u3300\0\u3333\0\u3366"+ - "\0\u3399\0\u33cc\0\u09f6\0\u33ff\0\u3432\0\u3465\0\u09f6\0\u09f6"+ - "\0\u09f6\0\u3498\0\u34cb\0\u34fe\0\u3531\0\u3564\0\u3597\0\u35ca"+ - "\0\u35fd\0\u0d59\0\u3630\0\u3663\0\u3696\0\u0d59\0\u0d59\0\u0d59"+ - "\0\u36c9\0\u36fc\0\u372f\0\u3762\0\u3795\0\u37c8\0\u1023\0\u37fb"+ - "\0\u382e\0\u3861\0\u1023\0\u1023\0\u1023\0\u3894\0\u38c7\0\u38fa"+ - "\0\u392d\0\u3960\0\u3993\0\u39c6\0\u39f9\0\u0891\0\u0891\0\u0891"+ - "\0\u3a2c\0\u3a5f\0\u3a92\0\u3ac5\0\u09f6\0\u3af8\0\u09f6\0\u09f6"+ - "\0\u09f6\0\u3b2b\0\u0693\0\u0693\0\u3b5e\0\u3b91\0\u3bc4\0\u0d59"+ - "\0\u3bf7\0\u0d59\0\u0d59\0\u0d59\0\u3c2a\0\u3c5d\0\u3c90\0\u3cc3"+ - "\0\u1023\0\u3cf6\0\u1023\0\u1023\0\u1023\0\u3d29\0\u3d5c\0\u0693"+ - "\0\u09f6\0\u3d8f\0\u09f6\0\u3dc2\0\u0d59\0\u3df5\0\u0d59\0\u3e28"+ - "\0\u1023\0\u3e5b\0\u1023\0\u3e8e\0\u09f6\0\u09f6\0\u0d59\0\u0d59"+ - "\0\u1023\0\u1023"; + "\0\u11ee\0\u1221\0\u1254\0\u0693\0\u0693\0\u0693\0\u0693\0\u0693"+ + "\0\u1287\0\u12ba\0\u12ed\0\u0693\0\u0693\0\u0693\0\u0693\0\u1320"+ + "\0\u1353\0\u1386\0\u0693\0\u13b9\0\u13ec\0\u141f\0\u1452\0\u082b"+ + "\0\u0693\0\u1485\0\u0693\0\u14b8\0\u14eb\0\u151e\0\u1551\0\u1584"+ + "\0\u09c3\0\u0693\0\u15b7\0\u15ea\0\u161d\0\u1650\0\u1683\0\u16b6"+ + "\0\u16e9\0\u171c\0\u174f\0\u1782\0\u17b5\0\u17e8\0\u181b\0\u0c8d"+ + "\0\u0693\0\u184e\0\u1881\0\u18b4\0\u18e7\0\u191a\0\u194d\0\u1980"+ + "\0\u19b3\0\u19e6\0\u1a19\0\u1a4c\0\u1a7f\0\u1ab2\0\u1ae5\0\u1b18"+ + "\0\u1b4b\0\u1b7e\0\u0ff0\0\u0693\0\u1bb1\0\u1be4\0\u1c17\0\u1c4a"+ + "\0\u1c7d\0\u1cb0\0\u1ce3\0\u1d16\0\u1d49\0\u1d7c\0\u1daf\0\u1de2"+ + "\0\u1e15\0\u12ba\0\u0693\0\u1e48\0\u1353\0\u0693\0\u1e7b\0\u1eae"+ + "\0\u1ee1\0\u1f14\0\u1f47\0\u1f7a\0\u1fad\0\u1fe0\0\u2013\0\u2046"+ + "\0\u2079\0\u20ac\0\u20df\0\u2112\0\u2145\0\u2178\0\u21ab\0\u21de"+ + "\0\u0a29\0\u2211\0\u2244\0\u2277\0\u22aa\0\u22dd\0\u2310\0\u2343"+ + "\0\u2376\0\u23a9\0\u23dc\0\u240f\0\u2442\0\u2475\0\u24a8\0\u24db"+ + "\0\u250e\0\u0d8c\0\u2541\0\u2574\0\u25a7\0\u25da\0\u260d\0\u2640"+ + "\0\u2673\0\u26a6\0\u26d9\0\u270c\0\u273f\0\u2772\0\u1056\0\u27a5"+ + "\0\u27d8\0\u280b\0\u283e\0\u2871\0\u28a4\0\u28d7\0\u290a\0\u293d"+ + "\0\u2970\0\u08c4\0\u08c4\0\u29a3\0\u29d6\0\u2a09\0\u2a3c\0\u2a6f"+ + "\0\u2aa2\0\u2ad5\0\u2b08\0\u2b3b\0\u2b6e\0\u2ba1\0\u2bd4\0\u2c07"+ + "\0\u2c3a\0\u2c6d\0\u2ca0\0\u2cd3\0\u0693\0\u0693\0\u2d06\0\u2d39"+ + "\0\u2d6c\0\u2d9f\0\u2dd2\0\u2e05\0\u2e38\0\u2e6b\0\u2e9e\0\u2ed1"+ + "\0\u2f04\0\u2f37\0\u2f6a\0\u2f9d\0\u2fd0\0\u3003\0\u3036\0\u3069"+ + "\0\u309c\0\u30cf\0\u3102\0\u3135\0\u3168\0\u319b\0\u31ce\0\u3201"+ + "\0\u3234\0\u3267\0\u329a\0\u08c4\0\u08c4\0\u32cd\0\u3300\0\u3333"+ + "\0\u3366\0\u3399\0\u33cc\0\u33ff\0\u0a29\0\u3432\0\u3465\0\u3498"+ + "\0\u0a29\0\u0a29\0\u0a29\0\u34cb\0\u34fe\0\u3531\0\u3564\0\u3597"+ + "\0\u35ca\0\u35fd\0\u3630\0\u0d8c\0\u3663\0\u3696\0\u36c9\0\u0d8c"+ + "\0\u0d8c\0\u0d8c\0\u36fc\0\u372f\0\u3762\0\u3795\0\u37c8\0\u37fb"+ + "\0\u1056\0\u382e\0\u3861\0\u3894\0\u1056\0\u1056\0\u1056\0\u38c7"+ + "\0\u38fa\0\u392d\0\u3960\0\u3993\0\u39c6\0\u39f9\0\u3a2c\0\u08c4"+ + "\0\u08c4\0\u08c4\0\u3a5f\0\u3a92\0\u3ac5\0\u3af8\0\u0a29\0\u3b2b"+ + "\0\u0a29\0\u0a29\0\u0a29\0\u3b5e\0\u0693\0\u0693\0\u3b91\0\u3bc4"+ + "\0\u3bf7\0\u0d8c\0\u3c2a\0\u0d8c\0\u0d8c\0\u0d8c\0\u3c5d\0\u3c90"+ + "\0\u3cc3\0\u3cf6\0\u1056\0\u3d29\0\u1056\0\u1056\0\u1056\0\u3d5c"+ + "\0\u3d8f\0\u0693\0\u0a29\0\u3dc2\0\u0a29\0\u3df5\0\u0d8c\0\u3e28"+ + "\0\u0d8c\0\u3e5b\0\u1056\0\u3e8e\0\u1056\0\u3ec1\0\u0a29\0\u0a29"+ + "\0\u0d8c\0\u0d8c\0\u1056\0\u1056"; private static int [] zzUnpackRowMap() { - int [] result = new int[426]; + int [] result = new int[428]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -279,257 +279,257 @@ private static int zzUnpackRowMap(String packed, int offset, int [] result) { "\1\42\5\56\6\42\1\57\1\42\27\56\4\42\3\43"+ "\4\42\1\60\1\42\1\55\1\42\5\61\10\42\27\61"+ "\4\42\3\43\1\42\1\62\3\42\1\63\2\42\5\63"+ - "\1\64\7\42\27\63\4\42\3\43\7\42\1\44\5\65"+ - "\1\42\1\66\2\42\1\67\1\42\1\46\1\42\3\65"+ - "\1\70\1\71\7\65\1\72\12\65\1\73\1\74\2\42"+ - "\3\43\3\42\1\75\1\54\1\42\1\55\1\42\5\56"+ - "\6\42\1\76\1\42\27\56\4\42\3\43\4\42\1\77"+ - "\1\42\1\55\1\42\5\100\10\42\27\100\4\42\3\43"+ - "\1\42\1\101\3\42\1\102\2\42\5\102\1\64\7\42"+ - "\27\102\4\42\3\43\7\42\1\44\5\65\1\103\3\42"+ - "\1\104\1\42\1\46\1\42\27\65\1\73\1\105\2\42"+ - "\3\43\7\42\1\44\5\106\10\42\1\106\1\107\1\106"+ - "\1\110\1\111\3\106\1\112\3\106\1\113\1\114\1\115"+ - "\1\106\1\116\1\117\5\106\1\42\1\105\2\42\3\43"+ - "\1\120\6\42\1\44\5\121\1\42\1\122\1\123\1\124"+ - "\1\125\1\42\1\46\1\42\27\121\1\42\1\105\2\42"+ - "\3\43\3\42\1\126\1\54\1\42\1\55\1\42\5\56"+ - "\6\42\1\127\1\42\27\56\4\42\3\43\4\42\1\130"+ - "\1\42\1\55\1\42\5\131\10\42\27\131\4\42\3\43"+ - "\1\42\1\132\3\42\1\133\2\42\5\133\1\64\7\42"+ - "\27\133\4\42\3\43\7\42\1\44\5\42\1\134\12\42"+ - "\1\135\1\136\7\42\1\137\13\42\1\74\2\42\3\43"+ - "\7\42\1\44\5\65\1\140\3\42\1\141\1\42\1\46"+ - "\1\42\27\65\1\73\1\142\2\42\3\43\7\42\1\44"+ - "\5\143\10\42\1\143\1\144\1\143\1\145\1\146\3\143"+ - "\1\147\3\143\1\150\1\151\1\152\1\143\1\153\1\154"+ - "\5\143\1\42\1\142\2\42\3\43\1\120\6\42\1\44"+ - "\5\155\1\42\1\156\1\157\1\124\1\125\1\42\1\46"+ - "\1\42\27\155\1\42\1\142\2\42\3\43\3\42\1\160"+ - "\1\54\1\42\1\55\1\42\5\56\6\42\1\161\1\42"+ - "\27\56\4\42\3\43\4\42\1\162\1\42\1\55\1\42"+ - "\5\163\10\42\27\163\4\42\3\43\1\42\1\164\3\42"+ - "\1\165\2\42\5\165\1\64\7\42\27\165\4\42\3\43"+ - "\7\42\1\44\5\65\1\166\3\42\1\167\1\42\1\46"+ - "\1\42\27\65\1\73\1\142\2\42\3\43\7\42\1\44"+ - "\5\170\10\42\1\170\1\171\1\170\1\172\1\173\3\170"+ - "\1\174\3\170\1\175\1\176\1\177\1\170\1\200\1\201"+ - "\5\170\1\42\1\142\2\42\3\43\1\120\6\42\1\44"+ - "\5\202\1\42\1\203\1\204\1\124\1\125\1\42\1\46"+ - "\1\42\27\202\1\42\1\142\2\42\3\43\3\42\1\205"+ - "\1\54\1\42\1\55\1\42\5\56\6\42\1\206\1\42"+ - "\27\56\4\42\3\43\4\42\1\207\1\42\1\55\1\42"+ - "\5\210\10\42\27\210\4\42\3\43\1\42\1\211\3\42"+ - "\1\212\2\42\5\212\1\64\7\42\27\212\4\42\3\43"+ - "\6\42\1\55\1\44\5\65\4\42\1\213\1\42\1\46"+ - "\1\42\27\65\1\73\1\142\2\42\3\43\3\42\1\214"+ - "\1\54\1\42\1\55\1\42\5\56\6\42\1\215\1\42"+ - "\27\56\4\42\3\43\4\42\1\216\1\42\1\55\1\42"+ - "\5\217\10\42\27\217\4\42\3\43\1\42\1\220\3\42"+ - "\1\221\2\42\5\221\1\64\7\42\27\221\4\42\3\43"+ - "\7\42\1\44\5\65\1\42\1\222\6\42\3\65\1\223"+ - "\1\224\22\65\3\42\64\0\3\43\72\0\1\225\104\0"+ - "\1\226\25\0\2\50\2\0\56\50\1\0\2\52\1\0"+ + "\1\64\7\42\27\63\4\42\3\65\7\42\1\44\5\66"+ + "\1\42\1\67\2\42\1\70\1\42\1\46\1\42\3\66"+ + "\1\71\1\72\7\66\1\73\12\66\1\74\1\75\2\42"+ + "\3\43\3\42\1\76\1\54\1\42\1\55\1\42\5\56"+ + "\6\42\1\77\1\42\27\56\4\42\3\43\4\42\1\100"+ + "\1\42\1\55\1\42\5\101\10\42\27\101\4\42\3\43"+ + "\1\42\1\102\3\42\1\103\2\42\5\103\1\64\7\42"+ + "\27\103\4\42\3\43\7\42\1\44\5\66\1\104\3\42"+ + "\1\105\1\42\1\46\1\42\27\66\1\74\1\106\2\42"+ + "\3\43\7\42\1\44\5\107\10\42\1\107\1\110\1\107"+ + "\1\111\1\112\3\107\1\113\3\107\1\114\1\115\1\116"+ + "\1\107\1\117\1\120\5\107\1\42\1\106\2\42\3\43"+ + "\1\121\6\42\1\44\5\122\1\42\1\123\1\124\1\125"+ + "\1\126\1\42\1\46\1\42\27\122\1\42\1\106\2\42"+ + "\3\43\3\42\1\127\1\54\1\42\1\55\1\42\5\56"+ + "\6\42\1\130\1\42\27\56\4\42\3\43\4\42\1\131"+ + "\1\42\1\55\1\42\5\132\10\42\27\132\4\42\3\43"+ + "\1\42\1\133\3\42\1\134\2\42\5\134\1\64\7\42"+ + "\27\134\4\42\3\43\7\42\1\44\5\42\1\135\12\42"+ + "\1\136\1\137\7\42\1\140\13\42\1\75\2\42\3\43"+ + "\7\42\1\44\5\66\1\141\3\42\1\142\1\42\1\46"+ + "\1\42\27\66\1\74\1\143\2\42\3\43\7\42\1\44"+ + "\5\144\10\42\1\144\1\145\1\144\1\146\1\147\3\144"+ + "\1\150\3\144\1\151\1\152\1\153\1\144\1\154\1\155"+ + "\5\144\1\42\1\143\2\42\3\43\1\121\6\42\1\44"+ + "\5\156\1\42\1\157\1\160\1\125\1\126\1\42\1\46"+ + "\1\42\27\156\1\42\1\143\2\42\3\43\3\42\1\161"+ + "\1\54\1\42\1\55\1\42\5\56\6\42\1\162\1\42"+ + "\27\56\4\42\3\43\4\42\1\163\1\42\1\55\1\42"+ + "\5\164\10\42\27\164\4\42\3\43\1\42\1\165\3\42"+ + "\1\166\2\42\5\166\1\64\7\42\27\166\4\42\3\43"+ + "\7\42\1\44\5\66\1\167\3\42\1\170\1\42\1\46"+ + "\1\42\27\66\1\74\1\143\2\42\3\43\7\42\1\44"+ + "\5\171\10\42\1\171\1\172\1\171\1\173\1\174\3\171"+ + "\1\175\3\171\1\176\1\177\1\200\1\171\1\201\1\202"+ + "\5\171\1\42\1\143\2\42\3\43\1\121\6\42\1\44"+ + "\5\203\1\42\1\204\1\205\1\125\1\126\1\42\1\46"+ + "\1\42\27\203\1\42\1\143\2\42\3\43\3\42\1\206"+ + "\1\54\1\42\1\55\1\42\5\56\6\42\1\207\1\42"+ + "\27\56\4\42\3\43\4\42\1\210\1\42\1\55\1\42"+ + "\5\211\10\42\27\211\4\42\3\43\1\42\1\212\3\42"+ + "\1\213\2\42\5\213\1\64\7\42\27\213\4\42\3\43"+ + "\6\42\1\55\1\44\5\66\4\42\1\214\1\42\1\46"+ + "\1\42\27\66\1\74\1\143\2\42\3\43\3\42\1\215"+ + "\1\54\1\42\1\55\1\42\5\56\6\42\1\216\1\42"+ + "\27\56\4\42\3\43\4\42\1\217\1\42\1\55\1\42"+ + "\5\220\10\42\27\220\4\42\3\43\1\42\1\221\3\42"+ + "\1\222\2\42\5\222\1\64\7\42\27\222\4\42\3\43"+ + "\7\42\1\44\5\66\1\42\1\223\6\42\3\66\1\224"+ + "\1\225\22\66\3\42\64\0\3\43\72\0\1\226\104\0"+ + "\1\227\25\0\2\50\2\0\56\50\1\0\2\52\1\0"+ "\60\52\14\0\5\56\10\0\27\56\17\0\5\61\10\0"+ - "\27\61\3\0\5\227\1\230\20\227\1\231\34\227\11\0"+ - "\1\63\2\0\5\63\10\0\27\63\17\0\5\65\10\0"+ - "\27\65\17\0\5\65\10\0\1\232\26\65\17\0\5\65"+ - "\10\0\15\65\1\233\2\65\1\234\4\65\1\235\1\65"+ - "\17\0\5\65\10\0\4\65\1\236\22\65\17\0\5\100"+ - "\10\0\27\100\3\0\5\237\1\240\20\237\1\241\34\237"+ - "\11\0\1\102\2\0\5\102\10\0\27\102\17\0\5\106"+ - "\10\0\27\106\17\0\5\106\10\0\16\106\1\242\7\106"+ - "\1\243\17\0\5\106\10\0\1\244\3\106\1\245\11\106"+ - "\1\246\10\106\17\0\5\106\10\0\20\106\1\247\6\106"+ - "\17\0\5\106\10\0\15\106\1\250\11\106\17\0\5\106"+ - "\10\0\1\251\26\106\17\0\5\106\10\0\23\106\1\252"+ - "\3\106\17\0\5\106\10\0\1\106\1\253\25\106\17\0"+ - "\5\106\10\0\4\106\1\254\22\106\17\0\5\106\10\0"+ - "\22\106\1\255\4\106\17\0\5\121\10\0\27\121\17\0"+ - "\5\131\10\0\27\131\3\0\5\256\1\257\20\256\1\260"+ - "\34\256\11\0\1\133\2\0\5\133\10\0\27\133\34\0"+ - "\1\261\77\0\1\262\2\0\1\263\46\0\1\264\41\0"+ - "\5\143\10\0\27\143\17\0\5\143\10\0\16\143\1\265"+ - "\7\143\1\266\17\0\5\143\10\0\1\267\3\143\1\270"+ - "\11\143\1\271\10\143\17\0\5\143\10\0\20\143\1\272"+ - "\6\143\17\0\5\143\10\0\15\143\1\273\11\143\17\0"+ - "\5\143\10\0\1\274\26\143\17\0\5\143\10\0\23\143"+ - "\1\275\3\143\17\0\5\143\10\0\1\143\1\276\25\143"+ - "\17\0\5\143\10\0\4\143\1\277\22\143\17\0\5\143"+ - "\10\0\22\143\1\300\4\143\17\0\5\155\10\0\27\155"+ - "\17\0\5\163\10\0\27\163\3\0\5\301\1\302\20\301"+ - "\1\303\34\301\11\0\1\165\2\0\5\165\10\0\27\165"+ - "\17\0\5\170\10\0\27\170\17\0\5\170\10\0\16\170"+ - "\1\304\7\170\1\305\17\0\5\170\10\0\1\306\3\170"+ - "\1\307\11\170\1\310\10\170\17\0\5\170\10\0\20\170"+ - "\1\311\6\170\17\0\5\170\10\0\15\170\1\312\11\170"+ - "\17\0\5\170\10\0\1\313\26\170\17\0\5\170\10\0"+ - "\23\170\1\314\3\170\17\0\5\170\10\0\1\170\1\315"+ - "\25\170\17\0\5\170\10\0\4\170\1\316\22\170\17\0"+ - "\5\170\10\0\22\170\1\317\4\170\17\0\5\202\10\0"+ - "\27\202\17\0\5\210\10\0\27\210\3\0\5\320\1\321"+ - "\20\320\1\322\34\320\11\0\1\212\2\0\5\212\10\0"+ - "\27\212\17\0\5\217\10\0\27\217\3\0\5\323\1\324"+ - "\20\323\1\325\34\323\11\0\1\221\2\0\5\221\10\0"+ - "\27\221\17\0\5\65\10\0\1\326\26\65\17\0\5\65"+ - "\10\0\15\65\1\327\11\65\3\0\2\225\1\0\60\225"+ - "\51\0\1\330\16\0\1\227\5\0\1\227\12\0\1\227"+ - "\3\0\1\227\3\0\1\227\7\0\1\227\2\0\1\227"+ - "\1\0\1\227\1\331\22\0\5\65\10\0\22\65\1\332"+ - "\4\65\17\0\5\65\10\0\23\65\1\333\3\65\17\0"+ - "\5\65\10\0\20\65\1\334\6\65\17\0\5\65\10\0"+ - "\22\65\1\335\4\65\17\0\5\65\10\0\22\65\1\336"+ - "\4\65\10\0\1\237\5\0\1\237\12\0\1\237\3\0"+ - "\1\237\3\0\1\237\7\0\1\237\2\0\1\237\1\0"+ - "\1\237\1\337\22\0\5\106\10\0\16\106\1\340\10\106"+ - "\17\0\5\106\10\0\22\106\1\341\4\106\17\0\5\106"+ - "\10\0\22\106\1\342\4\106\17\0\5\106\10\0\2\106"+ - "\1\343\24\106\17\0\5\106\10\0\23\106\1\344\3\106"+ - "\17\0\5\106\10\0\20\106\1\345\6\106\17\0\5\106"+ - "\10\0\22\106\1\346\4\106\17\0\5\106\10\0\17\106"+ - "\1\347\7\106\17\0\5\106\10\0\13\106\1\350\13\106"+ - "\17\0\5\106\10\0\11\106\1\351\15\106\17\0\5\106"+ - "\10\0\21\106\1\352\5\106\17\0\5\106\10\0\20\106"+ - "\1\353\6\106\10\0\1\256\5\0\1\256\12\0\1\256"+ - "\3\0\1\256\3\0\1\256\7\0\1\256\2\0\1\256"+ - "\1\0\1\256\1\354\61\0\1\355\63\0\1\356\57\0"+ - "\1\357\64\0\1\360\23\0\5\143\10\0\16\143\1\361"+ - "\10\143\17\0\5\143\10\0\22\143\1\362\4\143\17\0"+ - "\5\143\10\0\22\143\1\363\4\143\17\0\5\143\10\0"+ - "\2\143\1\364\24\143\17\0\5\143\10\0\23\143\1\365"+ - "\3\143\17\0\5\143\10\0\20\143\1\366\6\143\17\0"+ - "\5\143\10\0\22\143\1\367\4\143\17\0\5\143\10\0"+ - "\17\143\1\370\7\143\17\0\5\143\10\0\13\143\1\371"+ - "\13\143\17\0\5\143\10\0\11\143\1\372\15\143\17\0"+ - "\5\143\10\0\21\143\1\373\5\143\17\0\5\143\10\0"+ - "\20\143\1\374\6\143\10\0\1\301\5\0\1\301\12\0"+ - "\1\301\3\0\1\301\3\0\1\301\7\0\1\301\2\0"+ - "\1\301\1\0\1\301\1\375\22\0\5\170\10\0\16\170"+ - "\1\376\10\170\17\0\5\170\10\0\22\170\1\377\4\170"+ - "\17\0\5\170\10\0\22\170\1\u0100\4\170\17\0\5\170"+ - "\10\0\2\170\1\u0101\24\170\17\0\5\170\10\0\23\170"+ - "\1\u0102\3\170\17\0\5\170\10\0\20\170\1\u0103\6\170"+ - "\17\0\5\170\10\0\22\170\1\u0104\4\170\17\0\5\170"+ - "\10\0\17\170\1\u0105\7\170\17\0\5\170\10\0\13\170"+ - "\1\u0106\13\170\17\0\5\170\10\0\11\170\1\u0107\15\170"+ - "\17\0\5\170\10\0\21\170\1\u0108\5\170\17\0\5\170"+ - "\10\0\20\170\1\u0109\6\170\10\0\1\320\5\0\1\320"+ - "\12\0\1\320\3\0\1\320\3\0\1\320\7\0\1\320"+ - "\2\0\1\320\1\0\1\320\1\u010a\13\0\1\323\5\0"+ - "\1\323\12\0\1\323\3\0\1\323\3\0\1\323\7\0"+ - "\1\323\2\0\1\323\1\0\1\323\1\u010b\22\0\5\65"+ - "\10\0\22\65\1\u010c\4\65\17\0\5\65\10\0\23\65"+ - "\1\u010d\3\65\60\0\1\u010e\21\0\5\u010f\4\0\12\u010f"+ - "\40\0\5\65\10\0\1\u0110\26\65\17\0\5\65\10\0"+ - "\14\65\1\u0111\12\65\17\0\5\65\10\0\16\65\1\u0112"+ - "\10\65\17\0\5\65\10\0\4\65\1\u0113\22\65\17\0"+ - "\5\65\10\0\7\65\1\u0114\17\65\17\0\5\u0115\4\0"+ - "\12\u0115\40\0\5\106\10\0\13\106\1\u0116\13\106\17\0"+ - "\5\106\10\0\4\106\1\u0117\22\106\17\0\5\106\10\0"+ - "\4\106\1\u0118\22\106\17\0\5\106\10\0\10\106\1\u0119"+ - "\16\106\17\0\5\106\10\0\1\106\1\u011a\25\106\17\0"+ - "\5\106\10\0\16\106\1\u011b\10\106\17\0\2\106\1\u011c"+ - "\1\106\1\u011d\10\0\27\106\17\0\5\106\10\0\13\106"+ - "\1\u011e\13\106\17\0\5\106\10\0\4\106\1\u011f\22\106"+ - "\17\0\5\106\10\0\23\106\1\u0120\3\106\17\0\5\106"+ - "\10\0\10\106\1\u0121\16\106\17\0\5\u0122\4\0\12\u0122"+ - "\55\0\1\u0123\76\0\1\u0124\64\0\1\u0125\53\0\1\u0126"+ - "\36\0\5\143\10\0\13\143\1\u0127\13\143\17\0\5\143"+ - "\10\0\4\143\1\u0128\22\143\17\0\5\143\10\0\4\143"+ - "\1\u0129\22\143\17\0\5\143\10\0\10\143\1\u012a\16\143"+ - "\17\0\5\143\10\0\1\143\1\u012b\25\143\17\0\5\143"+ - "\10\0\16\143\1\u012c\10\143\17\0\2\143\1\u012d\1\143"+ - "\1\u012e\10\0\27\143\17\0\5\143\10\0\13\143\1\u012f"+ - "\13\143\17\0\5\143\10\0\4\143\1\u0130\22\143\17\0"+ - "\5\143\10\0\23\143\1\u0131\3\143\17\0\5\143\10\0"+ - "\10\143\1\u0132\16\143\17\0\5\u0133\4\0\12\u0133\40\0"+ - "\5\170\10\0\13\170\1\u0134\13\170\17\0\5\170\10\0"+ - "\4\170\1\u0135\22\170\17\0\5\170\10\0\4\170\1\u0136"+ - "\22\170\17\0\5\170\10\0\10\170\1\u0137\16\170\17\0"+ - "\5\170\10\0\1\170\1\u0138\25\170\17\0\5\170\10\0"+ - "\16\170\1\u0139\10\170\17\0\2\170\1\u013a\1\170\1\u013b"+ - "\10\0\27\170\17\0\5\170\10\0\13\170\1\u013c\13\170"+ - "\17\0\5\170\10\0\4\170\1\u013d\22\170\17\0\5\170"+ - "\10\0\23\170\1\u013e\3\170\17\0\5\170\10\0\10\170"+ - "\1\u013f\16\170\17\0\5\u0140\4\0\12\u0140\40\0\5\u0141"+ - "\4\0\12\u0141\40\0\5\65\10\0\1\u0142\26\65\17\0"+ - "\5\65\10\0\14\65\1\u0143\12\65\44\0\1\u0144\35\0"+ - "\5\u0145\4\0\12\u0145\40\0\5\65\10\0\20\65\1\u0146"+ - "\6\65\17\0\5\65\10\0\20\65\1\u0147\6\65\17\0"+ - "\5\65\10\0\16\65\1\u0148\10\65\17\0\5\u0149\4\0"+ - "\12\u0149\40\0\5\106\10\0\4\106\1\u014a\22\106\17\0"+ - "\5\106\10\0\21\106\1\u014b\5\106\17\0\5\106\10\0"+ - "\22\106\1\u014c\4\106\17\0\5\106\10\0\14\106\1\u014d"+ - "\12\106\17\0\5\106\10\0\13\106\1\u014e\13\106\17\0"+ - "\5\106\10\0\20\106\1\u014f\6\106\17\0\1\106\1\u0150"+ - "\3\106\10\0\27\106\17\0\3\106\1\u0151\1\106\10\0"+ - "\27\106\17\0\5\106\10\0\1\u0152\26\106\17\0\5\106"+ - "\10\0\2\106\1\u0153\24\106\17\0\5\106\10\0\13\106"+ - "\1\u0154\13\106\17\0\5\106\10\0\15\106\1\u0155\11\106"+ - "\17\0\5\u0156\4\0\12\u0156\75\0\1\u0157\60\0\1\u0158"+ - "\27\0\5\143\10\0\4\143\1\u0159\22\143\17\0\5\143"+ - "\10\0\21\143\1\u015a\5\143\17\0\5\143\10\0\22\143"+ - "\1\u015b\4\143\17\0\5\143\10\0\14\143\1\u015c\12\143"+ - "\17\0\5\143\10\0\13\143\1\u015d\13\143\17\0\5\143"+ - "\10\0\20\143\1\u015e\6\143\17\0\1\143\1\u015f\3\143"+ - "\10\0\27\143\17\0\3\143\1\u0160\1\143\10\0\27\143"+ - "\17\0\5\143\10\0\1\u0161\26\143\17\0\5\143\10\0"+ - "\2\143\1\u0162\24\143\17\0\5\143\10\0\13\143\1\u0163"+ - "\13\143\17\0\5\143\10\0\15\143\1\u0164\11\143\17\0"+ - "\5\u0165\4\0\12\u0165\40\0\5\170\10\0\4\170\1\u0166"+ - "\22\170\17\0\5\170\10\0\21\170\1\u0167\5\170\17\0"+ - "\5\170\10\0\22\170\1\u0168\4\170\17\0\5\170\10\0"+ - "\14\170\1\u0169\12\170\17\0\5\170\10\0\13\170\1\u016a"+ - "\13\170\17\0\5\170\10\0\20\170\1\u016b\6\170\17\0"+ - "\1\170\1\u016c\3\170\10\0\27\170\17\0\3\170\1\u016d"+ - "\1\170\10\0\27\170\17\0\5\170\10\0\1\u016e\26\170"+ - "\17\0\5\170\10\0\2\170\1\u016f\24\170\17\0\5\170"+ - "\10\0\13\170\1\u0170\13\170\17\0\5\170\10\0\15\170"+ - "\1\u0171\11\170\17\0\5\u0172\4\0\12\u0172\40\0\5\u0173"+ - "\4\0\12\u0173\57\0\1\u0174\43\0\5\u0175\4\0\12\u0175"+ - "\40\0\5\65\10\0\21\65\1\u0176\5\65\17\0\5\65"+ - "\10\0\15\65\1\u0177\11\65\17\0\5\65\10\0\3\65"+ - "\1\u0178\23\65\17\0\5\u0179\4\0\12\u0179\40\0\5\106"+ - "\10\0\1\u017a\26\106\17\0\5\106\10\0\10\106\1\u017b"+ - "\16\106\17\0\5\106\10\0\1\u017c\26\106\17\0\5\106"+ - "\10\0\4\106\1\u017d\22\106\17\0\5\106\10\0\1\106"+ - "\1\u017e\25\106\17\0\5\106\10\0\22\106\1\u017f\4\106"+ - "\17\0\5\106\10\0\22\106\1\u0180\4\106\17\0\5\106"+ - "\10\0\6\106\1\u0181\20\106\17\0\5\u0182\4\0\12\u0182"+ - "\76\0\1\u0183\44\0\1\u0184\42\0\5\143\10\0\1\u0185"+ - "\26\143\17\0\5\143\10\0\10\143\1\u0186\16\143\17\0"+ - "\5\143\10\0\1\u0187\26\143\17\0\5\143\10\0\4\143"+ - "\1\u0188\22\143\17\0\5\143\10\0\1\143\1\u0189\25\143"+ - "\17\0\5\143\10\0\22\143\1\u018a\4\143\17\0\5\143"+ - "\10\0\22\143\1\u018b\4\143\17\0\5\143\10\0\6\143"+ - "\1\u018c\20\143\17\0\5\u018d\4\0\12\u018d\40\0\5\170"+ - "\10\0\1\u018e\26\170\17\0\5\170\10\0\10\170\1\u018f"+ - "\16\170\17\0\5\170\10\0\1\u0190\26\170\17\0\5\170"+ - "\10\0\4\170\1\u0191\22\170\17\0\5\170\10\0\1\170"+ - "\1\u0192\25\170\17\0\5\170\10\0\22\170\1\u0193\4\170"+ - "\17\0\5\170\10\0\22\170\1\u0194\4\170\17\0\5\170"+ - "\10\0\6\170\1\u0195\20\170\17\0\5\u0196\4\0\12\u0196"+ - "\40\0\5\u0197\4\0\12\u0197\61\0\1\u0198\41\0\5\227"+ - "\4\0\12\227\40\0\5\237\4\0\12\237\40\0\5\106"+ - "\10\0\15\106\1\u0199\11\106\17\0\5\106\10\0\14\106"+ - "\1\u019a\12\106\17\0\5\106\10\0\13\106\1\u019b\13\106"+ - "\17\0\5\106\10\0\13\106\1\u019c\13\106\17\0\5\256"+ - "\4\0\12\256\40\0\5\143\10\0\15\143\1\u019d\11\143"+ - "\17\0\5\143\10\0\14\143\1\u019e\12\143\17\0\5\143"+ - "\10\0\13\143\1\u019f\13\143\17\0\5\143\10\0\13\143"+ - "\1\u01a0\13\143\17\0\5\301\4\0\12\301\40\0\5\170"+ - "\10\0\15\170\1\u01a1\11\170\17\0\5\170\10\0\14\170"+ - "\1\u01a2\12\170\17\0\5\170\10\0\13\170\1\u01a3\13\170"+ - "\17\0\5\170\10\0\13\170\1\u01a4\13\170\17\0\5\320"+ - "\4\0\12\320\40\0\5\323\4\0\12\323\40\0\5\106"+ - "\10\0\4\106\1\u01a5\22\106\17\0\5\106\10\0\4\106"+ - "\1\u01a6\22\106\17\0\5\143\10\0\4\143\1\u01a7\22\143"+ - "\17\0\5\143\10\0\4\143\1\u01a8\22\143\17\0\5\170"+ - "\10\0\4\170\1\u01a9\22\170\17\0\5\170\10\0\4\170"+ - "\1\u01aa\22\170\3\0"; + "\27\61\3\0\5\230\1\231\20\230\1\232\34\230\11\0"+ + "\1\63\2\0\5\63\10\0\27\63\4\0\3\65\2\0"+ + "\1\233\70\0\5\66\10\0\27\66\17\0\5\66\10\0"+ + "\1\234\26\66\17\0\5\66\10\0\15\66\1\235\2\66"+ + "\1\236\4\66\1\237\1\66\17\0\5\66\10\0\4\66"+ + "\1\240\22\66\17\0\5\101\10\0\27\101\3\0\5\241"+ + "\1\242\20\241\1\243\34\241\11\0\1\103\2\0\5\103"+ + "\10\0\27\103\17\0\5\107\10\0\27\107\17\0\5\107"+ + "\10\0\16\107\1\244\7\107\1\245\17\0\5\107\10\0"+ + "\1\246\3\107\1\247\11\107\1\250\10\107\17\0\5\107"+ + "\10\0\20\107\1\251\6\107\17\0\5\107\10\0\15\107"+ + "\1\252\11\107\17\0\5\107\10\0\1\253\26\107\17\0"+ + "\5\107\10\0\23\107\1\254\3\107\17\0\5\107\10\0"+ + "\1\107\1\255\25\107\17\0\5\107\10\0\4\107\1\256"+ + "\22\107\17\0\5\107\10\0\22\107\1\257\4\107\17\0"+ + "\5\122\10\0\27\122\17\0\5\132\10\0\27\132\3\0"+ + "\5\260\1\261\20\260\1\262\34\260\11\0\1\134\2\0"+ + "\5\134\10\0\27\134\34\0\1\263\77\0\1\264\2\0"+ + "\1\265\46\0\1\266\41\0\5\144\10\0\27\144\17\0"+ + "\5\144\10\0\16\144\1\267\7\144\1\270\17\0\5\144"+ + "\10\0\1\271\3\144\1\272\11\144\1\273\10\144\17\0"+ + "\5\144\10\0\20\144\1\274\6\144\17\0\5\144\10\0"+ + "\15\144\1\275\11\144\17\0\5\144\10\0\1\276\26\144"+ + "\17\0\5\144\10\0\23\144\1\277\3\144\17\0\5\144"+ + "\10\0\1\144\1\300\25\144\17\0\5\144\10\0\4\144"+ + "\1\301\22\144\17\0\5\144\10\0\22\144\1\302\4\144"+ + "\17\0\5\156\10\0\27\156\17\0\5\164\10\0\27\164"+ + "\3\0\5\303\1\304\20\303\1\305\34\303\11\0\1\166"+ + "\2\0\5\166\10\0\27\166\17\0\5\171\10\0\27\171"+ + "\17\0\5\171\10\0\16\171\1\306\7\171\1\307\17\0"+ + "\5\171\10\0\1\310\3\171\1\311\11\171\1\312\10\171"+ + "\17\0\5\171\10\0\20\171\1\313\6\171\17\0\5\171"+ + "\10\0\15\171\1\314\11\171\17\0\5\171\10\0\1\315"+ + "\26\171\17\0\5\171\10\0\23\171\1\316\3\171\17\0"+ + "\5\171\10\0\1\171\1\317\25\171\17\0\5\171\10\0"+ + "\4\171\1\320\22\171\17\0\5\171\10\0\22\171\1\321"+ + "\4\171\17\0\5\203\10\0\27\203\17\0\5\211\10\0"+ + "\27\211\3\0\5\322\1\323\20\322\1\324\34\322\11\0"+ + "\1\213\2\0\5\213\10\0\27\213\17\0\5\220\10\0"+ + "\27\220\3\0\5\325\1\326\20\325\1\327\34\325\11\0"+ + "\1\222\2\0\5\222\10\0\27\222\17\0\5\66\10\0"+ + "\1\330\26\66\17\0\5\66\10\0\15\66\1\331\11\66"+ + "\3\0\2\226\1\0\60\226\51\0\1\332\16\0\1\230"+ + "\5\0\1\230\12\0\1\230\3\0\1\230\3\0\1\230"+ + "\7\0\1\230\2\0\1\230\1\0\1\230\1\333\22\0"+ + "\5\66\10\0\22\66\1\334\4\66\17\0\5\66\10\0"+ + "\23\66\1\335\3\66\17\0\5\66\10\0\20\66\1\336"+ + "\6\66\17\0\5\66\10\0\22\66\1\337\4\66\17\0"+ + "\5\66\10\0\22\66\1\340\4\66\10\0\1\241\5\0"+ + "\1\241\12\0\1\241\3\0\1\241\3\0\1\241\7\0"+ + "\1\241\2\0\1\241\1\0\1\241\1\341\22\0\5\107"+ + "\10\0\16\107\1\342\10\107\17\0\5\107\10\0\22\107"+ + "\1\343\4\107\17\0\5\107\10\0\22\107\1\344\4\107"+ + "\17\0\5\107\10\0\2\107\1\345\24\107\17\0\5\107"+ + "\10\0\23\107\1\346\3\107\17\0\5\107\10\0\20\107"+ + "\1\347\6\107\17\0\5\107\10\0\22\107\1\350\4\107"+ + "\17\0\5\107\10\0\17\107\1\351\7\107\17\0\5\107"+ + "\10\0\13\107\1\352\13\107\17\0\5\107\10\0\11\107"+ + "\1\353\15\107\17\0\5\107\10\0\21\107\1\354\5\107"+ + "\17\0\5\107\10\0\20\107\1\355\6\107\10\0\1\260"+ + "\5\0\1\260\12\0\1\260\3\0\1\260\3\0\1\260"+ + "\7\0\1\260\2\0\1\260\1\0\1\260\1\356\61\0"+ + "\1\357\63\0\1\360\57\0\1\361\64\0\1\362\23\0"+ + "\5\144\10\0\16\144\1\363\10\144\17\0\5\144\10\0"+ + "\22\144\1\364\4\144\17\0\5\144\10\0\22\144\1\365"+ + "\4\144\17\0\5\144\10\0\2\144\1\366\24\144\17\0"+ + "\5\144\10\0\23\144\1\367\3\144\17\0\5\144\10\0"+ + "\20\144\1\370\6\144\17\0\5\144\10\0\22\144\1\371"+ + "\4\144\17\0\5\144\10\0\17\144\1\372\7\144\17\0"+ + "\5\144\10\0\13\144\1\373\13\144\17\0\5\144\10\0"+ + "\11\144\1\374\15\144\17\0\5\144\10\0\21\144\1\375"+ + "\5\144\17\0\5\144\10\0\20\144\1\376\6\144\10\0"+ + "\1\303\5\0\1\303\12\0\1\303\3\0\1\303\3\0"+ + "\1\303\7\0\1\303\2\0\1\303\1\0\1\303\1\377"+ + "\22\0\5\171\10\0\16\171\1\u0100\10\171\17\0\5\171"+ + "\10\0\22\171\1\u0101\4\171\17\0\5\171\10\0\22\171"+ + "\1\u0102\4\171\17\0\5\171\10\0\2\171\1\u0103\24\171"+ + "\17\0\5\171\10\0\23\171\1\u0104\3\171\17\0\5\171"+ + "\10\0\20\171\1\u0105\6\171\17\0\5\171\10\0\22\171"+ + "\1\u0106\4\171\17\0\5\171\10\0\17\171\1\u0107\7\171"+ + "\17\0\5\171\10\0\13\171\1\u0108\13\171\17\0\5\171"+ + "\10\0\11\171\1\u0109\15\171\17\0\5\171\10\0\21\171"+ + "\1\u010a\5\171\17\0\5\171\10\0\20\171\1\u010b\6\171"+ + "\10\0\1\322\5\0\1\322\12\0\1\322\3\0\1\322"+ + "\3\0\1\322\7\0\1\322\2\0\1\322\1\0\1\322"+ + "\1\u010c\13\0\1\325\5\0\1\325\12\0\1\325\3\0"+ + "\1\325\3\0\1\325\7\0\1\325\2\0\1\325\1\0"+ + "\1\325\1\u010d\22\0\5\66\10\0\22\66\1\u010e\4\66"+ + "\17\0\5\66\10\0\23\66\1\u010f\3\66\60\0\1\u0110"+ + "\21\0\5\u0111\4\0\12\u0111\40\0\5\66\10\0\1\u0112"+ + "\26\66\17\0\5\66\10\0\14\66\1\u0113\12\66\17\0"+ + "\5\66\10\0\16\66\1\u0114\10\66\17\0\5\66\10\0"+ + "\4\66\1\u0115\22\66\17\0\5\66\10\0\7\66\1\u0116"+ + "\17\66\17\0\5\u0117\4\0\12\u0117\40\0\5\107\10\0"+ + "\13\107\1\u0118\13\107\17\0\5\107\10\0\4\107\1\u0119"+ + "\22\107\17\0\5\107\10\0\4\107\1\u011a\22\107\17\0"+ + "\5\107\10\0\10\107\1\u011b\16\107\17\0\5\107\10\0"+ + "\1\107\1\u011c\25\107\17\0\5\107\10\0\16\107\1\u011d"+ + "\10\107\17\0\2\107\1\u011e\1\107\1\u011f\10\0\27\107"+ + "\17\0\5\107\10\0\13\107\1\u0120\13\107\17\0\5\107"+ + "\10\0\4\107\1\u0121\22\107\17\0\5\107\10\0\23\107"+ + "\1\u0122\3\107\17\0\5\107\10\0\10\107\1\u0123\16\107"+ + "\17\0\5\u0124\4\0\12\u0124\55\0\1\u0125\76\0\1\u0126"+ + "\64\0\1\u0127\53\0\1\u0128\36\0\5\144\10\0\13\144"+ + "\1\u0129\13\144\17\0\5\144\10\0\4\144\1\u012a\22\144"+ + "\17\0\5\144\10\0\4\144\1\u012b\22\144\17\0\5\144"+ + "\10\0\10\144\1\u012c\16\144\17\0\5\144\10\0\1\144"+ + "\1\u012d\25\144\17\0\5\144\10\0\16\144\1\u012e\10\144"+ + "\17\0\2\144\1\u012f\1\144\1\u0130\10\0\27\144\17\0"+ + "\5\144\10\0\13\144\1\u0131\13\144\17\0\5\144\10\0"+ + "\4\144\1\u0132\22\144\17\0\5\144\10\0\23\144\1\u0133"+ + "\3\144\17\0\5\144\10\0\10\144\1\u0134\16\144\17\0"+ + "\5\u0135\4\0\12\u0135\40\0\5\171\10\0\13\171\1\u0136"+ + "\13\171\17\0\5\171\10\0\4\171\1\u0137\22\171\17\0"+ + "\5\171\10\0\4\171\1\u0138\22\171\17\0\5\171\10\0"+ + "\10\171\1\u0139\16\171\17\0\5\171\10\0\1\171\1\u013a"+ + "\25\171\17\0\5\171\10\0\16\171\1\u013b\10\171\17\0"+ + "\2\171\1\u013c\1\171\1\u013d\10\0\27\171\17\0\5\171"+ + "\10\0\13\171\1\u013e\13\171\17\0\5\171\10\0\4\171"+ + "\1\u013f\22\171\17\0\5\171\10\0\23\171\1\u0140\3\171"+ + "\17\0\5\171\10\0\10\171\1\u0141\16\171\17\0\5\u0142"+ + "\4\0\12\u0142\40\0\5\u0143\4\0\12\u0143\40\0\5\66"+ + "\10\0\1\u0144\26\66\17\0\5\66\10\0\14\66\1\u0145"+ + "\12\66\44\0\1\u0146\35\0\5\u0147\4\0\12\u0147\40\0"+ + "\5\66\10\0\20\66\1\u0148\6\66\17\0\5\66\10\0"+ + "\20\66\1\u0149\6\66\17\0\5\66\10\0\16\66\1\u014a"+ + "\10\66\17\0\5\u014b\4\0\12\u014b\40\0\5\107\10\0"+ + "\4\107\1\u014c\22\107\17\0\5\107\10\0\21\107\1\u014d"+ + "\5\107\17\0\5\107\10\0\22\107\1\u014e\4\107\17\0"+ + "\5\107\10\0\14\107\1\u014f\12\107\17\0\5\107\10\0"+ + "\13\107\1\u0150\13\107\17\0\5\107\10\0\20\107\1\u0151"+ + "\6\107\17\0\1\107\1\u0152\3\107\10\0\27\107\17\0"+ + "\3\107\1\u0153\1\107\10\0\27\107\17\0\5\107\10\0"+ + "\1\u0154\26\107\17\0\5\107\10\0\2\107\1\u0155\24\107"+ + "\17\0\5\107\10\0\13\107\1\u0156\13\107\17\0\5\107"+ + "\10\0\15\107\1\u0157\11\107\17\0\5\u0158\4\0\12\u0158"+ + "\75\0\1\u0159\60\0\1\u015a\27\0\5\144\10\0\4\144"+ + "\1\u015b\22\144\17\0\5\144\10\0\21\144\1\u015c\5\144"+ + "\17\0\5\144\10\0\22\144\1\u015d\4\144\17\0\5\144"+ + "\10\0\14\144\1\u015e\12\144\17\0\5\144\10\0\13\144"+ + "\1\u015f\13\144\17\0\5\144\10\0\20\144\1\u0160\6\144"+ + "\17\0\1\144\1\u0161\3\144\10\0\27\144\17\0\3\144"+ + "\1\u0162\1\144\10\0\27\144\17\0\5\144\10\0\1\u0163"+ + "\26\144\17\0\5\144\10\0\2\144\1\u0164\24\144\17\0"+ + "\5\144\10\0\13\144\1\u0165\13\144\17\0\5\144\10\0"+ + "\15\144\1\u0166\11\144\17\0\5\u0167\4\0\12\u0167\40\0"+ + "\5\171\10\0\4\171\1\u0168\22\171\17\0\5\171\10\0"+ + "\21\171\1\u0169\5\171\17\0\5\171\10\0\22\171\1\u016a"+ + "\4\171\17\0\5\171\10\0\14\171\1\u016b\12\171\17\0"+ + "\5\171\10\0\13\171\1\u016c\13\171\17\0\5\171\10\0"+ + "\20\171\1\u016d\6\171\17\0\1\171\1\u016e\3\171\10\0"+ + "\27\171\17\0\3\171\1\u016f\1\171\10\0\27\171\17\0"+ + "\5\171\10\0\1\u0170\26\171\17\0\5\171\10\0\2\171"+ + "\1\u0171\24\171\17\0\5\171\10\0\13\171\1\u0172\13\171"+ + "\17\0\5\171\10\0\15\171\1\u0173\11\171\17\0\5\u0174"+ + "\4\0\12\u0174\40\0\5\u0175\4\0\12\u0175\57\0\1\u0176"+ + "\43\0\5\u0177\4\0\12\u0177\40\0\5\66\10\0\21\66"+ + "\1\u0178\5\66\17\0\5\66\10\0\15\66\1\u0179\11\66"+ + "\17\0\5\66\10\0\3\66\1\u017a\23\66\17\0\5\u017b"+ + "\4\0\12\u017b\40\0\5\107\10\0\1\u017c\26\107\17\0"+ + "\5\107\10\0\10\107\1\u017d\16\107\17\0\5\107\10\0"+ + "\1\u017e\26\107\17\0\5\107\10\0\4\107\1\u017f\22\107"+ + "\17\0\5\107\10\0\1\107\1\u0180\25\107\17\0\5\107"+ + "\10\0\22\107\1\u0181\4\107\17\0\5\107\10\0\22\107"+ + "\1\u0182\4\107\17\0\5\107\10\0\6\107\1\u0183\20\107"+ + "\17\0\5\u0184\4\0\12\u0184\76\0\1\u0185\44\0\1\u0186"+ + "\42\0\5\144\10\0\1\u0187\26\144\17\0\5\144\10\0"+ + "\10\144\1\u0188\16\144\17\0\5\144\10\0\1\u0189\26\144"+ + "\17\0\5\144\10\0\4\144\1\u018a\22\144\17\0\5\144"+ + "\10\0\1\144\1\u018b\25\144\17\0\5\144\10\0\22\144"+ + "\1\u018c\4\144\17\0\5\144\10\0\22\144\1\u018d\4\144"+ + "\17\0\5\144\10\0\6\144\1\u018e\20\144\17\0\5\u018f"+ + "\4\0\12\u018f\40\0\5\171\10\0\1\u0190\26\171\17\0"+ + "\5\171\10\0\10\171\1\u0191\16\171\17\0\5\171\10\0"+ + "\1\u0192\26\171\17\0\5\171\10\0\4\171\1\u0193\22\171"+ + "\17\0\5\171\10\0\1\171\1\u0194\25\171\17\0\5\171"+ + "\10\0\22\171\1\u0195\4\171\17\0\5\171\10\0\22\171"+ + "\1\u0196\4\171\17\0\5\171\10\0\6\171\1\u0197\20\171"+ + "\17\0\5\u0198\4\0\12\u0198\40\0\5\u0199\4\0\12\u0199"+ + "\61\0\1\u019a\41\0\5\230\4\0\12\230\40\0\5\241"+ + "\4\0\12\241\40\0\5\107\10\0\15\107\1\u019b\11\107"+ + "\17\0\5\107\10\0\14\107\1\u019c\12\107\17\0\5\107"+ + "\10\0\13\107\1\u019d\13\107\17\0\5\107\10\0\13\107"+ + "\1\u019e\13\107\17\0\5\260\4\0\12\260\40\0\5\144"+ + "\10\0\15\144\1\u019f\11\144\17\0\5\144\10\0\14\144"+ + "\1\u01a0\12\144\17\0\5\144\10\0\13\144\1\u01a1\13\144"+ + "\17\0\5\144\10\0\13\144\1\u01a2\13\144\17\0\5\303"+ + "\4\0\12\303\40\0\5\171\10\0\15\171\1\u01a3\11\171"+ + "\17\0\5\171\10\0\14\171\1\u01a4\12\171\17\0\5\171"+ + "\10\0\13\171\1\u01a5\13\171\17\0\5\171\10\0\13\171"+ + "\1\u01a6\13\171\17\0\5\322\4\0\12\322\40\0\5\325"+ + "\4\0\12\325\40\0\5\107\10\0\4\107\1\u01a7\22\107"+ + "\17\0\5\107\10\0\4\107\1\u01a8\22\107\17\0\5\144"+ + "\10\0\4\144\1\u01a9\22\144\17\0\5\144\10\0\4\144"+ + "\1\u01aa\22\144\17\0\5\171\10\0\4\171\1\u01ab\22\171"+ + "\17\0\5\171\10\0\4\171\1\u01ac\22\171\3\0"; private static int [] zzUnpacktrans() { - int [] result = new int[16065]; + int [] result = new int[16116]; int offset = 0; offset = zzUnpacktrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -568,21 +568,21 @@ private static int zzUnpacktrans(String packed, int offset, int [] result) { private static final String ZZ_ATTRIBUTE_PACKED_0 = "\41\0\1\11\2\1\2\11\2\1\1\11\1\1\3\11"+ - "\1\1\2\11\3\1\1\11\1\1\2\11\3\1\5\11"+ + "\1\1\2\11\3\1\1\11\2\1\2\11\3\1\5\11"+ "\3\1\3\11\12\1\1\11\1\1\7\11\3\1\1\11"+ "\3\1\3\11\13\1\5\11\3\1\2\11\13\1\5\11"+ "\3\1\4\11\3\1\1\11\3\1\2\0\1\11\1\0"+ - "\5\1\1\0\1\11\1\0\14\1\1\0\1\11\5\0"+ - "\14\1\1\0\1\11\1\0\14\1\1\0\1\11\2\0"+ - "\1\11\1\0\2\1\2\0\5\1\1\0\14\1\5\0"+ - "\14\1\1\0\14\1\2\0\2\1\2\0\5\1\1\0"+ - "\14\1\1\0\2\11\2\0\14\1\1\0\14\1\2\0"+ - "\2\1\2\0\3\1\1\0\14\1\3\0\14\1\1\0"+ - "\14\1\4\0\3\1\1\0\10\1\1\0\2\11\10\1"+ - "\1\0\10\1\2\0\1\11\22\1"; + "\1\11\5\1\1\0\1\11\1\0\14\1\1\0\1\11"+ + "\5\0\14\1\1\0\1\11\1\0\14\1\1\0\1\11"+ + "\2\0\1\11\1\0\2\1\2\0\5\1\1\0\14\1"+ + "\5\0\14\1\1\0\14\1\2\0\2\1\2\0\5\1"+ + "\1\0\14\1\1\0\2\11\2\0\14\1\1\0\14\1"+ + "\2\0\2\1\2\0\3\1\1\0\14\1\3\0\14\1"+ + "\1\0\14\1\4\0\3\1\1\0\10\1\1\0\2\11"+ + "\10\1\1\0\10\1\2\0\1\11\22\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[426]; + int [] result = new int[428]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -900,597 +900,605 @@ else if (zzAtEOF) { { return BAD_CHARACTER; } // fall through - case 120: break; + case 121: break; case 2: { return WHITE_SPACE; } // fall through - case 121: break; + case 122: break; case 3: { yybegin(SERVICE_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 122: break; + case 123: break; case 4: { return RIGHT_BRACKET; } // fall through - case 123: break; + case 124: break; case 5: { return MARKDOWNTEXT; } // fall through - case 124: break; + case 125: break; case 6: { return MARKDOWNHEADING; } // fall through - case 125: break; + case 126: break; case 7: { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 126: break; + case 127: break; case 8: { return RIGHT_PAREN; } // fall through - case 127: break; + case 128: break; case 9: { return COMMA; } // fall through - case 128: break; + case 129: break; case 10: { return ATTRIBUTENAME; } // fall through - case 129: break; + case 130: break; case 11: { yybegin(YYINITIAL); return RIGHT_BRACKET; } // fall through - case 130: break; + case 131: break; case 12: { yybegin(SERVICE_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 131: break; + case 132: break; case 13: { yybegin(SERVICE_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 132: break; + case 133: break; case 14: { yybegin(SERVICE_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 133: break; + case 134: break; case 15: { return COLON; } // fall through - case 134: break; + case 135: break; case 16: { return IDENTIFIER; } // fall through - case 135: break; + case 136: break; case 17: { return SEMI; } // fall through - case 136: break; + case 137: break; case 18: { yybegin(SERVICE_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 137: break; + case 138: break; case 19: { return LEFT_BRACE; } // fall through - case 138: break; + case 139: break; case 20: { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } // fall through - case 139: break; + case 140: break; case 21: { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 140: break; + case 141: break; case 22: { yybegin(SERVICE_BODY); return RIGHT_BRACKET; } // fall through - case 141: break; + case 142: break; case 23: { yybegin(SERVICE_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 142: break; + case 143: break; case 24: { yybegin(SERVICE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 143: break; + case 144: break; case 25: { yybegin(SERVICE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 144: break; + case 145: break; case 26: { yybegin(METHOD_BODY_TYPE); return COLON; } // fall through - case 145: break; + case 146: break; case 27: { yybegin(METHOD_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 146: break; + case 147: break; case 28: { yybegin(RESPONSE_SEPARATOR); return RIGHT_BRACE; } // fall through - case 147: break; + case 148: break; case 29: { yybegin(METHOD_BODY_TYPE_END); return TYPENAME; } // fall through - case 148: break; + case 149: break; case 30: { return BANG; } // fall through - case 149: break; + case 150: break; case 31: { yybegin(METHOD_BODY); return IDENTIFIER; } // fall through - case 150: break; + case 151: break; case 32: { yybegin(METHOD_BODY); return SEMI; } // fall through - case 151: break; + case 152: break; case 33: { yybegin(METHOD_BODY_TYPE); return LEFT_ANGLE; } // fall through - case 152: break; + case 153: break; case 34: { return RIGHT_ANGLE; } // fall through - case 153: break; + case 154: break; case 35: { return LEFT_BRACKET; } // fall through - case 154: break; + case 155: break; case 36: { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 155: break; + case 156: break; case 37: { yybegin(METHOD_BODY); return RIGHT_BRACKET; } // fall through - case 156: break; + case 157: break; case 38: { yybegin(METHOD_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 157: break; + case 158: break; case 39: { yybegin(METHOD_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 158: break; + case 159: break; case 40: { yybegin(METHOD_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 159: break; + case 160: break; case 41: { yybegin(RESPONSE_BODY); return COLON; } // fall through - case 160: break; + case 161: break; case 42: { yybegin(RESPONSE_BODY_TYPE); return COLON; } // fall through - case 161: break; + case 162: break; case 43: { yybegin(RESPONSE_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 162: break; + case 163: break; case 44: { yybegin(SERVICE_BODY); return RIGHT_BRACE; } // fall through - case 163: break; + case 164: break; case 45: { yybegin(RESPONSE_BODY_TYPE_END); return TYPENAME; } // fall through - case 164: break; + case 165: break; case 46: { yybegin(RESPONSE_BODY); return IDENTIFIER; } // fall through - case 165: break; + case 166: break; case 47: { yybegin(RESPONSE_BODY); return SEMI; } // fall through - case 166: break; + case 167: break; case 48: { yybegin(RESPONSE_BODY_TYPE); return LEFT_ANGLE; } // fall through - case 167: break; + case 168: break; case 49: { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 168: break; + case 169: break; case 50: { yybegin(RESPONSE_BODY); return RIGHT_BRACKET; } // fall through - case 169: break; + case 170: break; case 51: { yybegin(RESPONSE_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 170: break; + case 171: break; case 52: { yybegin(RESPONSE_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 171: break; + case 172: break; case 53: { yybegin(RESPONSE_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 172: break; + case 173: break; case 54: { yybegin(DATA_BODY_TYPE); return COLON; } // fall through - case 173: break; + case 174: break; case 55: { yybegin(DATA_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 174: break; + case 175: break; case 56: { yybegin(DATA_BODY_TYPE_END); return TYPENAME; } // fall through - case 175: break; + case 176: break; case 57: { yybegin(DATA_BODY); return IDENTIFIER; } // fall through - case 176: break; + case 177: break; case 58: { yybegin(DATA_BODY); return SEMI; } // fall through - case 177: break; + case 178: break; case 59: { yybegin(DATA_BODY_TYPE); return LEFT_ANGLE; } // fall through - case 178: break; + case 179: break; case 60: { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 179: break; + case 180: break; case 61: { yybegin(DATA_BODY); return RIGHT_BRACKET; } // fall through - case 180: break; + case 181: break; case 62: { yybegin(DATA_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 181: break; + case 182: break; case 63: { yybegin(DATA_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 182: break; + case 183: break; case 64: { yybegin(DATA_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 183: break; + case 184: break; case 65: { yybegin(LIST_BODY_ATTRIBUTE); return LEFT_BRACKET; } // fall through - case 184: break; + case 185: break; case 66: { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return LEFT_PAREN; } // fall through - case 185: break; + case 186: break; case 67: { yybegin(LIST_BODY); return RIGHT_BRACKET; } // fall through - case 186: break; + case 187: break; case 68: { yybegin(LIST_BODY_ATTRIBUTE); return RIGHT_PAREN; } // fall through - case 187: break; + case 188: break; case 69: { yybegin(LIST_BODY_ATTRIBUTE_ARGUMENT); return IDENTIFIER; } // fall through - case 188: break; + case 189: break; case 70: { yybegin(LIST_BODY_ATTRIBUTE_PARAMETER_LIST); return ATTRIBUTEPARAMETERVALUE; } // fall through - case 189: break; + case 190: break; case 71: { yybegin(SERVICE_BODY); return SEMI; } // fall through - case 190: break; + case 191: break; case 72: { return COMMENT; } // fall through - case 191: break; + case 192: break; case 73: - { yybegin(METHOD_BODY_TYPE_END); return MAP; + // lookahead expression with fixed lookahead length + zzMarkedPos = Character.offsetByCodePoints + (zzBufferL, zzMarkedPos, -1); + { yybegin(MARKDOWN_SECTION); return WHITE_SPACE; } // fall through - case 192: break; + case 193: break; case 74: - { yybegin(RESPONSE_BODY_TYPE_END); return MAP; + { yybegin(METHOD_BODY_TYPE_END); return MAP; } // fall through - case 193: break; + case 194: break; case 75: - { yybegin(DATA_BODY_TYPE_END); return MAP; + { yybegin(RESPONSE_BODY_TYPE_END); return MAP; } // fall through - case 194: break; + case 195: break; case 76: - { yybegin(DATA_BODY); return DATA; + { yybegin(DATA_BODY_TYPE_END); return MAP; } // fall through - case 195: break; + case 196: break; case 77: - { yybegin(LIST_BODY); return ENUM; + { yybegin(DATA_BODY); return DATA; } // fall through - case 196: break; + case 197: break; case 78: - { return DATA; + { yybegin(LIST_BODY); return ENUM; } // fall through - case 197: break; + case 198: break; case 79: - { return ENUM; + { return DATA; } // fall through - case 198: break; + case 199: break; case 80: - { yybegin(METHOD_BODY_TYPE_END); return BYTES; + { return ENUM; } // fall through - case 199: break; + case 200: break; case 81: - { yybegin(METHOD_BODY_TYPE_END); return ERROR; + { yybegin(METHOD_BODY_TYPE_END); return BYTES; } // fall through - case 200: break; + case 201: break; case 82: - { yybegin(METHOD_BODY_TYPE_END); return INT32; + { yybegin(METHOD_BODY_TYPE_END); return ERROR; } // fall through - case 201: break; + case 202: break; case 83: - { yybegin(METHOD_BODY_TYPE_END); return INT64; + { yybegin(METHOD_BODY_TYPE_END); return INT32; } // fall through - case 202: break; + case 203: break; case 84: - { yybegin(RESPONSE_BODY_TYPE_END); return BYTES; + { yybegin(METHOD_BODY_TYPE_END); return INT64; } // fall through - case 203: break; + case 204: break; case 85: - { yybegin(RESPONSE_BODY_TYPE_END); return ERROR; + { yybegin(RESPONSE_BODY_TYPE_END); return BYTES; } // fall through - case 204: break; + case 205: break; case 86: - { yybegin(RESPONSE_BODY_TYPE_END); return INT32; + { yybegin(RESPONSE_BODY_TYPE_END); return ERROR; } // fall through - case 205: break; + case 206: break; case 87: - { yybegin(RESPONSE_BODY_TYPE_END); return INT64; + { yybegin(RESPONSE_BODY_TYPE_END); return INT32; } // fall through - case 206: break; + case 207: break; case 88: - { yybegin(DATA_BODY_TYPE_END); return BYTES; + { yybegin(RESPONSE_BODY_TYPE_END); return INT64; } // fall through - case 207: break; + case 208: break; case 89: - { yybegin(DATA_BODY_TYPE_END); return ERROR; + { yybegin(DATA_BODY_TYPE_END); return BYTES; } // fall through - case 208: break; + case 209: break; case 90: - { yybegin(DATA_BODY_TYPE_END); return INT32; + { yybegin(DATA_BODY_TYPE_END); return ERROR; } // fall through - case 209: break; + case 210: break; case 91: - { yybegin(DATA_BODY_TYPE_END); return INT64; + { yybegin(DATA_BODY_TYPE_END); return INT32; } // fall through - case 210: break; + case 211: break; case 92: - { yybegin(LIST_BODY); return ERRORS; + { yybegin(DATA_BODY_TYPE_END); return INT64; } // fall through - case 211: break; + case 212: break; case 93: - { yybegin(EXTERN_DECL); return EXTERN; + { yybegin(LIST_BODY); return ERRORS; } // fall through - case 212: break; + case 213: break; case 94: - { yybegin(METHOD_BODY); return METHOD; + { yybegin(EXTERN_DECL); return EXTERN; } // fall through - case 213: break; + case 214: break; case 95: - { yybegin(METHOD_BODY_TYPE_END); return DOUBLE; + { yybegin(METHOD_BODY); return METHOD; } // fall through - case 214: break; + case 215: break; case 96: - { yybegin(METHOD_BODY_TYPE_END); return OBJECT; + { yybegin(METHOD_BODY_TYPE_END); return DOUBLE; } // fall through - case 215: break; + case 216: break; case 97: - { yybegin(METHOD_BODY_TYPE_END); return RESULT; + { yybegin(METHOD_BODY_TYPE_END); return OBJECT; } // fall through - case 216: break; + case 217: break; case 98: - { yybegin(METHOD_BODY_TYPE_END); return STRING; + { yybegin(METHOD_BODY_TYPE_END); return RESULT; } // fall through - case 217: break; + case 218: break; case 99: - { yybegin(RESPONSE_BODY_TYPE_END); return DOUBLE; + { yybegin(METHOD_BODY_TYPE_END); return STRING; } // fall through - case 218: break; + case 219: break; case 100: - { yybegin(RESPONSE_BODY_TYPE_END); return OBJECT; + { yybegin(RESPONSE_BODY_TYPE_END); return DOUBLE; } // fall through - case 219: break; + case 220: break; case 101: - { yybegin(RESPONSE_BODY_TYPE_END); return RESULT; + { yybegin(RESPONSE_BODY_TYPE_END); return OBJECT; } // fall through - case 220: break; + case 221: break; case 102: - { yybegin(RESPONSE_BODY_TYPE_END); return STRING; + { yybegin(RESPONSE_BODY_TYPE_END); return RESULT; } // fall through - case 221: break; + case 222: break; case 103: - { yybegin(DATA_BODY_TYPE_END); return DOUBLE; + { yybegin(RESPONSE_BODY_TYPE_END); return STRING; } // fall through - case 222: break; + case 223: break; case 104: - { yybegin(DATA_BODY_TYPE_END); return OBJECT; + { yybegin(DATA_BODY_TYPE_END); return DOUBLE; } // fall through - case 223: break; + case 224: break; case 105: - { yybegin(DATA_BODY_TYPE_END); return RESULT; + { yybegin(DATA_BODY_TYPE_END); return OBJECT; } // fall through - case 224: break; + case 225: break; case 106: - { yybegin(DATA_BODY_TYPE_END); return STRING; + { yybegin(DATA_BODY_TYPE_END); return RESULT; } // fall through - case 225: break; + case 226: break; case 107: - { yybegin(SERVICE_BODY); return SERVICE; + { yybegin(DATA_BODY_TYPE_END); return STRING; } // fall through - case 226: break; + case 227: break; case 108: - { yybegin(METHOD_BODY_TYPE_END); return BOOLEAN; + { yybegin(SERVICE_BODY); return SERVICE; } // fall through - case 227: break; + case 228: break; case 109: - { yybegin(METHOD_BODY_TYPE_END); return DECIMAL; + { yybegin(METHOD_BODY_TYPE_END); return BOOLEAN; } // fall through - case 228: break; + case 229: break; case 110: - { yybegin(RESPONSE_BODY_TYPE_END); return BOOLEAN; + { yybegin(METHOD_BODY_TYPE_END); return DECIMAL; } // fall through - case 229: break; + case 230: break; case 111: - { yybegin(RESPONSE_BODY_TYPE_END); return DECIMAL; + { yybegin(RESPONSE_BODY_TYPE_END); return BOOLEAN; } // fall through - case 230: break; + case 231: break; case 112: - { yybegin(DATA_BODY_TYPE_END); return BOOLEAN; + { yybegin(RESPONSE_BODY_TYPE_END); return DECIMAL; } // fall through - case 231: break; + case 232: break; case 113: - { yybegin(DATA_BODY_TYPE_END); return DECIMAL; + { yybegin(DATA_BODY_TYPE_END); return BOOLEAN; } // fall through - case 232: break; + case 233: break; case 114: - { yybegin(METHOD_BODY_TYPE_END); return DATETIME; + { yybegin(DATA_BODY_TYPE_END); return DECIMAL; } // fall through - case 233: break; + case 234: break; case 115: - { yybegin(METHOD_BODY_TYPE_END); return NULLABLE; + { yybegin(METHOD_BODY_TYPE_END); return DATETIME; } // fall through - case 234: break; + case 235: break; case 116: - { yybegin(RESPONSE_BODY_TYPE_END); return DATETIME; + { yybegin(METHOD_BODY_TYPE_END); return NULLABLE; } // fall through - case 235: break; + case 236: break; case 117: - { yybegin(RESPONSE_BODY_TYPE_END); return NULLABLE; + { yybegin(RESPONSE_BODY_TYPE_END); return DATETIME; } // fall through - case 236: break; + case 237: break; case 118: - { yybegin(DATA_BODY_TYPE_END); return DATETIME; + { yybegin(RESPONSE_BODY_TYPE_END); return NULLABLE; } // fall through - case 237: break; + case 238: break; case 119: + { yybegin(DATA_BODY_TYPE_END); return DATETIME; + } + // fall through + case 239: break; + case 120: { yybegin(DATA_BODY_TYPE_END); return NULLABLE; } // fall through - case 238: break; + case 240: break; default: zzScanError(ZZ_NO_MATCH); } diff --git a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex index e048727..c231900 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex +++ b/src/main/kotlin/io/github/facilityapi/intellij/lexer/_FsdLexer.flex @@ -89,6 +89,7 @@ MARKDOWN_TEXT=.+ "enum" { yybegin(LIST_BODY); return ENUM; } ";" { return SEMI; } + {WHITE_SPACE}/# { yybegin(MARKDOWN_SECTION); return WHITE_SPACE; } "{" { return LEFT_BRACE; } "}" { yybegin(MARKDOWN_SECTION); return RIGHT_BRACE; } "[" { yybegin(SERVICE_BODY_ATTRIBUTE); return LEFT_BRACKET; } From 9aee9873c0e77e9bdab34b464cd58f515b98a6aa Mon Sep 17 00:00:00 2001 From: bryankenote Date: Fri, 3 Jan 2025 16:46:53 -0800 Subject: [PATCH 08/11] lookahead for # or eof to finish parsing service items when using semicolon --- .../intellij/parser/FsdParser.java | 26 +++++++++++++++++-- .../io/github/facilityapi/intellij/fsd.bnf | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index 9ae96fd..65883ab 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -787,7 +787,7 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | (';' decorated_service_item*) | decorated_service_item + // ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; @@ -822,13 +822,14 @@ private static boolean service_items_0_1(PsiBuilder b, int l) { return true; } - // ';' decorated_service_item* + // ';' decorated_service_item* &('#' | <>) private static boolean service_items_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items_1")) return false; boolean r; Marker m = enter_section_(b); r = consumeToken(b, SEMI); r = r && service_items_1_1(b, l + 1); + r = r && service_items_1_2(b, l + 1); exit_section_(b, m, null, r); return r; } @@ -844,6 +845,27 @@ private static boolean service_items_1_1(PsiBuilder b, int l) { return true; } + // &('#' | <>) + private static boolean service_items_1_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_2")) return false; + boolean r; + Marker m = enter_section_(b, l, _AND_); + r = service_items_1_2_0(b, l + 1); + exit_section_(b, l, m, r, false, null); + return r; + } + + // '#' | <> + private static boolean service_items_1_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_2_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, "#"); + if (!r) r = eof(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + /* ********************************************************** */ // service identifier service_items public static boolean service_spec(PsiBuilder b, int l) { diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 5204843..7d170ef 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -43,7 +43,7 @@ definition ::= (attribute_list* service_spec) markdown_remarks* service_spec ::= service identifier service_items { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | (';' decorated_service_item*) | decorated_service_item +service_items ::= ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method) From f6129f0fb886d79c634cb0dc2ae9feb772ddb578 Mon Sep 17 00:00:00 2001 From: bryankenote Date: Mon, 6 Jan 2025 13:36:22 -0800 Subject: [PATCH 09/11] simplify grammar --- .../intellij/parser/FsdParser.java | 83 ++++++++----------- .../intellij/psi/FsdMarkdownRemarks.java | 5 +- .../psi/impl/FsdMarkdownRemarksImpl.java | 10 +-- .../io/github/facilityapi/intellij/fsd.bnf | 6 +- 4 files changed, 40 insertions(+), 64 deletions(-) diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index 65883ab..04c23be 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -315,47 +315,37 @@ private static boolean decorated_service_item_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // (attribute_list* service_spec) markdown_remarks* + // attribute_list* service_spec markdown_remarks* static boolean definition(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "definition")) return false; if (!nextTokenIs(b, "", LEFT_BRACKET, SERVICE)) return false; boolean r; Marker m = enter_section_(b); r = definition_0(b, l + 1); - r = r && definition_1(b, l + 1); - exit_section_(b, m, null, r); - return r; - } - - // attribute_list* service_spec - private static boolean definition_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "definition_0")) return false; - boolean r; - Marker m = enter_section_(b); - r = definition_0_0(b, l + 1); r = r && service_spec(b, l + 1); + r = r && definition_2(b, l + 1); exit_section_(b, m, null, r); return r; } // attribute_list* - private static boolean definition_0_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "definition_0_0")) return false; + private static boolean definition_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "definition_0")) return false; while (true) { int c = current_position_(b); if (!attribute_list(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "definition_0_0", c)) break; + if (!empty_element_parsed_guard_(b, "definition_0", c)) break; } return true; } // markdown_remarks* - private static boolean definition_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "definition_1")) return false; + private static boolean definition_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "definition_2")) return false; while (true) { int c = current_position_(b); if (!markdown_remarks(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "definition_1", c)) break; + if (!empty_element_parsed_guard_(b, "definition_2", c)) break; } return true; } @@ -681,18 +671,29 @@ public static boolean identifier_declaration(PsiBuilder b, int l) { } /* ********************************************************** */ - // markdownheading | markdowntext + // markdownheading markdowntext* public static boolean markdown_remarks(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "markdown_remarks")) return false; - if (!nextTokenIs(b, "", MARKDOWNHEADING, MARKDOWNTEXT)) return false; + if (!nextTokenIs(b, MARKDOWNHEADING)) return false; boolean r; - Marker m = enter_section_(b, l, _NONE_, MARKDOWN_REMARKS, ""); + Marker m = enter_section_(b); r = consumeToken(b, MARKDOWNHEADING); - if (!r) r = consumeToken(b, MARKDOWNTEXT); - exit_section_(b, l, m, r, false, null); + r = r && markdown_remarks_1(b, l + 1); + exit_section_(b, m, MARKDOWN_REMARKS, r); return r; } + // markdowntext* + private static boolean markdown_remarks_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "markdown_remarks_1")) return false; + while (true) { + int c = current_position_(b); + if (!consumeToken(b, MARKDOWNTEXT)) break; + if (!empty_element_parsed_guard_(b, "markdown_remarks_1", c)) break; + } + return true; + } + /* ********************************************************** */ // method identifier_declaration request_fields ':' response_fields public static boolean method_spec(PsiBuilder b, int l) { @@ -787,14 +788,13 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item + // ('{' decorated_service_item* '}') | ([';'] decorated_service_item*) public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; Marker m = enter_section_(b, l, _NONE_, SERVICE_ITEMS, ""); r = service_items_0(b, l + 1); if (!r) r = service_items_1(b, l + 1); - if (!r) r = decorated_service_item(b, l + 1); exit_section_(b, l, m, r, false, null); return r; } @@ -822,18 +822,24 @@ private static boolean service_items_0_1(PsiBuilder b, int l) { return true; } - // ';' decorated_service_item* &('#' | <>) + // [';'] decorated_service_item* private static boolean service_items_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items_1")) return false; boolean r; Marker m = enter_section_(b); - r = consumeToken(b, SEMI); + r = service_items_1_0(b, l + 1); r = r && service_items_1_1(b, l + 1); - r = r && service_items_1_2(b, l + 1); exit_section_(b, m, null, r); return r; } + // [';'] + private static boolean service_items_1_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_0")) return false; + consumeToken(b, SEMI); + return true; + } + // decorated_service_item* private static boolean service_items_1_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items_1_1")) return false; @@ -845,27 +851,6 @@ private static boolean service_items_1_1(PsiBuilder b, int l) { return true; } - // &('#' | <>) - private static boolean service_items_1_2(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "service_items_1_2")) return false; - boolean r; - Marker m = enter_section_(b, l, _AND_); - r = service_items_1_2_0(b, l + 1); - exit_section_(b, l, m, r, false, null); - return r; - } - - // '#' | <> - private static boolean service_items_1_2_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "service_items_1_2_0")) return false; - boolean r; - Marker m = enter_section_(b); - r = consumeToken(b, "#"); - if (!r) r = eof(b, l + 1); - exit_section_(b, m, null, r); - return r; - } - /* ********************************************************** */ // service identifier service_items public static boolean service_spec(PsiBuilder b, int l) { diff --git a/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java b/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java index 3e29cd2..9839037 100644 --- a/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java +++ b/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java @@ -7,10 +7,7 @@ public interface FsdMarkdownRemarks extends PsiElement { - @Nullable + @NotNull PsiElement getMarkdownheading(); - @Nullable - PsiElement getMarkdowntext(); - } diff --git a/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java b/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java index 7f07a73..fc544f4 100644 --- a/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java +++ b/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java @@ -28,15 +28,9 @@ public void accept(@NotNull PsiElementVisitor visitor) { } @Override - @Nullable + @NotNull public PsiElement getMarkdownheading() { - return findChildByType(MARKDOWNHEADING); - } - - @Override - @Nullable - public PsiElement getMarkdowntext() { - return findChildByType(MARKDOWNTEXT); + return findNotNullChildByType(MARKDOWNHEADING); } } diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 7d170ef..072a606 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -40,10 +40,10 @@ implements("decorated_.*")="io.github.facilityapi.intellij.psi.FsdDecoratedElement" } -definition ::= (attribute_list* service_spec) markdown_remarks* +definition ::= attribute_list* service_spec markdown_remarks* service_spec ::= service identifier service_items { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item +service_items ::= ('{' decorated_service_item* '}') | ([';'] decorated_service_item*) decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method) @@ -89,4 +89,4 @@ reference_type ::= typename { methods=[getReference] } -markdown_remarks ::= markdownheading | markdowntext +markdown_remarks ::= markdownheading markdowntext* From 7a136558596383cfae03c3495f9e471e051dbefb Mon Sep 17 00:00:00 2001 From: bryankenote Date: Mon, 6 Jan 2025 15:04:03 -0800 Subject: [PATCH 10/11] Revert "simplify grammar" This reverts commit f6129f0fb886d79c634cb0dc2ae9feb772ddb578. --- .../intellij/parser/FsdParser.java | 83 +++++++++++-------- .../intellij/psi/FsdMarkdownRemarks.java | 5 +- .../psi/impl/FsdMarkdownRemarksImpl.java | 10 ++- .../io/github/facilityapi/intellij/fsd.bnf | 6 +- 4 files changed, 64 insertions(+), 40 deletions(-) diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index 04c23be..65883ab 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -315,37 +315,47 @@ private static boolean decorated_service_item_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // attribute_list* service_spec markdown_remarks* + // (attribute_list* service_spec) markdown_remarks* static boolean definition(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "definition")) return false; if (!nextTokenIs(b, "", LEFT_BRACKET, SERVICE)) return false; boolean r; Marker m = enter_section_(b); r = definition_0(b, l + 1); - r = r && service_spec(b, l + 1); - r = r && definition_2(b, l + 1); + r = r && definition_1(b, l + 1); exit_section_(b, m, null, r); return r; } - // attribute_list* + // attribute_list* service_spec private static boolean definition_0(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "definition_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = definition_0_0(b, l + 1); + r = r && service_spec(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // attribute_list* + private static boolean definition_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "definition_0_0")) return false; while (true) { int c = current_position_(b); if (!attribute_list(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "definition_0", c)) break; + if (!empty_element_parsed_guard_(b, "definition_0_0", c)) break; } return true; } // markdown_remarks* - private static boolean definition_2(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "definition_2")) return false; + private static boolean definition_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "definition_1")) return false; while (true) { int c = current_position_(b); if (!markdown_remarks(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "definition_2", c)) break; + if (!empty_element_parsed_guard_(b, "definition_1", c)) break; } return true; } @@ -671,29 +681,18 @@ public static boolean identifier_declaration(PsiBuilder b, int l) { } /* ********************************************************** */ - // markdownheading markdowntext* + // markdownheading | markdowntext public static boolean markdown_remarks(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "markdown_remarks")) return false; - if (!nextTokenIs(b, MARKDOWNHEADING)) return false; + if (!nextTokenIs(b, "", MARKDOWNHEADING, MARKDOWNTEXT)) return false; boolean r; - Marker m = enter_section_(b); + Marker m = enter_section_(b, l, _NONE_, MARKDOWN_REMARKS, ""); r = consumeToken(b, MARKDOWNHEADING); - r = r && markdown_remarks_1(b, l + 1); - exit_section_(b, m, MARKDOWN_REMARKS, r); + if (!r) r = consumeToken(b, MARKDOWNTEXT); + exit_section_(b, l, m, r, false, null); return r; } - // markdowntext* - private static boolean markdown_remarks_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "markdown_remarks_1")) return false; - while (true) { - int c = current_position_(b); - if (!consumeToken(b, MARKDOWNTEXT)) break; - if (!empty_element_parsed_guard_(b, "markdown_remarks_1", c)) break; - } - return true; - } - /* ********************************************************** */ // method identifier_declaration request_fields ':' response_fields public static boolean method_spec(PsiBuilder b, int l) { @@ -788,13 +787,14 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | ([';'] decorated_service_item*) + // ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; Marker m = enter_section_(b, l, _NONE_, SERVICE_ITEMS, ""); r = service_items_0(b, l + 1); if (!r) r = service_items_1(b, l + 1); + if (!r) r = decorated_service_item(b, l + 1); exit_section_(b, l, m, r, false, null); return r; } @@ -822,24 +822,18 @@ private static boolean service_items_0_1(PsiBuilder b, int l) { return true; } - // [';'] decorated_service_item* + // ';' decorated_service_item* &('#' | <>) private static boolean service_items_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items_1")) return false; boolean r; Marker m = enter_section_(b); - r = service_items_1_0(b, l + 1); + r = consumeToken(b, SEMI); r = r && service_items_1_1(b, l + 1); + r = r && service_items_1_2(b, l + 1); exit_section_(b, m, null, r); return r; } - // [';'] - private static boolean service_items_1_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "service_items_1_0")) return false; - consumeToken(b, SEMI); - return true; - } - // decorated_service_item* private static boolean service_items_1_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items_1_1")) return false; @@ -851,6 +845,27 @@ private static boolean service_items_1_1(PsiBuilder b, int l) { return true; } + // &('#' | <>) + private static boolean service_items_1_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_2")) return false; + boolean r; + Marker m = enter_section_(b, l, _AND_); + r = service_items_1_2_0(b, l + 1); + exit_section_(b, l, m, r, false, null); + return r; + } + + // '#' | <> + private static boolean service_items_1_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_2_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, "#"); + if (!r) r = eof(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + /* ********************************************************** */ // service identifier service_items public static boolean service_spec(PsiBuilder b, int l) { diff --git a/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java b/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java index 9839037..3e29cd2 100644 --- a/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java +++ b/src/main/gen/io/github/facilityapi/intellij/psi/FsdMarkdownRemarks.java @@ -7,7 +7,10 @@ public interface FsdMarkdownRemarks extends PsiElement { - @NotNull + @Nullable PsiElement getMarkdownheading(); + @Nullable + PsiElement getMarkdowntext(); + } diff --git a/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java b/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java index fc544f4..7f07a73 100644 --- a/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java +++ b/src/main/gen/io/github/facilityapi/intellij/psi/impl/FsdMarkdownRemarksImpl.java @@ -28,9 +28,15 @@ public void accept(@NotNull PsiElementVisitor visitor) { } @Override - @NotNull + @Nullable public PsiElement getMarkdownheading() { - return findNotNullChildByType(MARKDOWNHEADING); + return findChildByType(MARKDOWNHEADING); + } + + @Override + @Nullable + public PsiElement getMarkdowntext() { + return findChildByType(MARKDOWNTEXT); } } diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 072a606..7d170ef 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -40,10 +40,10 @@ implements("decorated_.*")="io.github.facilityapi.intellij.psi.FsdDecoratedElement" } -definition ::= attribute_list* service_spec markdown_remarks* +definition ::= (attribute_list* service_spec) markdown_remarks* service_spec ::= service identifier service_items { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | ([';'] decorated_service_item*) +service_items ::= ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method) @@ -89,4 +89,4 @@ reference_type ::= typename { methods=[getReference] } -markdown_remarks ::= markdownheading markdowntext* +markdown_remarks ::= markdownheading | markdowntext From 952c8491211dc8d27571969b387b22dbcb159b8d Mon Sep 17 00:00:00 2001 From: bryankenote Date: Mon, 6 Jan 2025 15:45:00 -0800 Subject: [PATCH 11/11] simplify grammar --- .../intellij/parser/FsdParser.java | 36 ++++++------------- .../io/github/facilityapi/intellij/fsd.bnf | 2 +- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java index 65883ab..66d81ef 100644 --- a/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java +++ b/src/main/gen/io/github/facilityapi/intellij/parser/FsdParser.java @@ -787,14 +787,13 @@ private static boolean service_item_recover_0(PsiBuilder b, int l) { } /* ********************************************************** */ - // ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item + // ('{' decorated_service_item* '}') | ([';'] decorated_service_item*) public static boolean service_items(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items")) return false; boolean r; Marker m = enter_section_(b, l, _NONE_, SERVICE_ITEMS, ""); r = service_items_0(b, l + 1); if (!r) r = service_items_1(b, l + 1); - if (!r) r = decorated_service_item(b, l + 1); exit_section_(b, l, m, r, false, null); return r; } @@ -822,18 +821,24 @@ private static boolean service_items_0_1(PsiBuilder b, int l) { return true; } - // ';' decorated_service_item* &('#' | <>) + // [';'] decorated_service_item* private static boolean service_items_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items_1")) return false; boolean r; Marker m = enter_section_(b); - r = consumeToken(b, SEMI); + r = service_items_1_0(b, l + 1); r = r && service_items_1_1(b, l + 1); - r = r && service_items_1_2(b, l + 1); exit_section_(b, m, null, r); return r; } + // [';'] + private static boolean service_items_1_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "service_items_1_0")) return false; + consumeToken(b, SEMI); + return true; + } + // decorated_service_item* private static boolean service_items_1_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "service_items_1_1")) return false; @@ -845,27 +850,6 @@ private static boolean service_items_1_1(PsiBuilder b, int l) { return true; } - // &('#' | <>) - private static boolean service_items_1_2(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "service_items_1_2")) return false; - boolean r; - Marker m = enter_section_(b, l, _AND_); - r = service_items_1_2_0(b, l + 1); - exit_section_(b, l, m, r, false, null); - return r; - } - - // '#' | <> - private static boolean service_items_1_2_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "service_items_1_2_0")) return false; - boolean r; - Marker m = enter_section_(b); - r = consumeToken(b, "#"); - if (!r) r = eof(b, l + 1); - exit_section_(b, m, null, r); - return r; - } - /* ********************************************************** */ // service identifier service_items public static boolean service_spec(PsiBuilder b, int l) { diff --git a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf index 7d170ef..f087c57 100644 --- a/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf +++ b/src/main/kotlin/io/github/facilityapi/intellij/fsd.bnf @@ -43,7 +43,7 @@ definition ::= (attribute_list* service_spec) markdown_remarks* service_spec ::= service identifier service_items { pin=1 } -service_items ::= ('{' decorated_service_item* '}') | (';' decorated_service_item* &('#' | <>)) | decorated_service_item +service_items ::= ('{' decorated_service_item* '}') | ([';'] decorated_service_item*) decorated_service_item ::= attribute_list* service_item private service_item ::= (extern_decl | enum_spec | data_spec | method_spec | error_set_spec) { recoverWhile=service_item_recover } private service_item_recover ::= !('[' | '}' | extern | enum | data | errors | method)