| ... | ... | @@ -7713,36 +7713,35 @@ fn readU32Be() u32 {} |
| 7713 | 7713 | <p>For some discussion on the rationale behind these design decisions, see <a href="https://github.com/ziglang/zig/issues/663">issue #663</a></p> |
| 7714 | 7714 | {#header_close#} |
| 7715 | 7715 | {#header_open|Grammar#} |
| 7716 | | <pre><code class="nohighlight"> |
| 7717 | | Root <- skip ContainerMembers eof |
| 7716 | <pre><code>Root &lt;- skip ContainerMembers eof |
| 7718 | 7717 | |
| 7719 | 7718 | # *** Top level *** |
| 7720 | 7719 | ContainerMembers |
| 7721 | | <- TestDecl ContainerMembers |
| 7720 | &lt;- TestDecl ContainerMembers |
| 7722 | 7721 | / TopLevelComptime ContainerMembers |
| 7723 | 7722 | / KEYWORD_pub? TopLevelDecl ContainerMembers |
| 7724 | 7723 | / KEYWORD_pub? ContainerField COMMA ContainerMembers |
| 7725 | 7724 | / KEYWORD_pub? ContainerField |
| 7726 | 7725 | / |
| 7727 | 7726 | |
| 7728 | | TestDecl <- KEYWORD_test STRINGLITERAL Block |
| 7727 | TestDecl &lt;- KEYWORD_test STRINGLITERAL Block |
| 7729 | 7728 | |
| 7730 | | TopLevelComptime <- KEYWORD_comptime BlockExpr |
| 7729 | TopLevelComptime &lt;- KEYWORD_comptime BlockExpr |
| 7731 | 7730 | |
| 7732 | 7731 | TopLevelDecl |
| 7733 | | <- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / KEYWORD_inline)? FnProto (SEMICOLON / Block) |
| 7732 | &lt;- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / KEYWORD_inline)? FnProto (SEMICOLON / Block) |
| 7734 | 7733 | / (KEYWORD_export / KEYWORD_extern STRINGLITERAL?)? VarDecl |
| 7735 | 7734 | / KEYWORD_use Expr SEMICOLON |
| 7736 | 7735 | |
| 7737 | | FnProto <- FnCC? KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? Section? EXCLAMATIONMARK? (KEYWORD_var / TypeExpr) |
| 7736 | FnProto &lt;- FnCC? KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? EXCLAMATIONMARK? (KEYWORD_var / TypeExpr) |
| 7738 | 7737 | |
| 7739 | | VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? Section? (EQUAL Expr)? SEMICOLON |
| 7738 | VarDecl &lt;- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON |
| 7740 | 7739 | |
| 7741 | | ContainerField <- IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)? |
| 7740 | ContainerField &lt;- IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)? |
| 7742 | 7741 | |
| 7743 | 7742 | # *** Block Level *** |
| 7744 | 7743 | Statement |
| 7745 | | <- KEYWORD_comptime? VarDecl |
| 7744 | &lt;- KEYWORD_comptime? VarDecl |
| 7746 | 7745 | / KEYWORD_comptime BlockExprStatement |
| 7747 | 7746 | / KEYWORD_suspend (SEMICOLON / BlockExprStatement) |
| 7748 | 7747 | / KEYWORD_defer BlockExprStatement |
| ... | ... | @@ -7753,50 +7752,50 @@ Statement |
| 7753 | 7752 | / AssignExpr SEMICOLON |
| 7754 | 7753 | |
| 7755 | 7754 | IfStatement |
| 7756 | | <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? |
| 7755 | &lt;- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )? |
| 7757 | 7756 | / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) |
| 7758 | 7757 | |
| 7759 | | LabeledStatement <- BlockLabel? (Block / LoopStatement) |
| 7758 | LabeledStatement &lt;- BlockLabel? (Block / LoopStatement) |
| 7760 | 7759 | |
| 7761 | | LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement) |
| 7760 | LoopStatement &lt;- KEYWORD_inline? (ForStatement / WhileStatement) |
| 7762 | 7761 | |
| 7763 | 7762 | ForStatement |
| 7764 | | <- ForPrefix BlockExpr ( KEYWORD_else Statement )? |
| 7763 | &lt;- ForPrefix BlockExpr ( KEYWORD_else Statement )? |
| 7765 | 7764 | / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement ) |
| 7766 | 7765 | |
| 7767 | 7766 | WhileStatement |
| 7768 | | <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? |
| 7767 | &lt;- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )? |
| 7769 | 7768 | / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement ) |
| 7770 | 7769 | |
| 7771 | 7770 | BlockExprStatement |
| 7772 | | <- BlockExpr |
| 7771 | &lt;- BlockExpr |
| 7773 | 7772 | / AssignExpr SEMICOLON |
| 7774 | 7773 | |
| 7775 | | BlockExpr <- BlockLabel? Block |
| 7774 | BlockExpr &lt;- BlockLabel? Block |
| 7776 | 7775 | |
| 7777 | 7776 | # *** Expression Level *** |
| 7778 | | AssignExpr <- Expr (AssignOp Expr)? |
| 7777 | AssignExpr &lt;- Expr (AssignOp Expr)? |
| 7779 | 7778 | |
| 7780 | | Expr <- KEYWORD_try* BoolOrExpr |
| 7779 | Expr &lt;- KEYWORD_try* BoolOrExpr |
| 7781 | 7780 | |
| 7782 | | BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)* |
| 7781 | BoolOrExpr &lt;- BoolAndExpr (KEYWORD_or BoolAndExpr)* |
| 7783 | 7782 | |
| 7784 | | BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)* |
| 7783 | BoolAndExpr &lt;- CompareExpr (KEYWORD_and CompareExpr)* |
| 7785 | 7784 | |
| 7786 | | CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)? |
| 7785 | CompareExpr &lt;- BitwiseExpr (CompareOp BitwiseExpr)? |
| 7787 | 7786 | |
| 7788 | | BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)* |
| 7787 | BitwiseExpr &lt;- BitShiftExpr (BitwiseOp BitShiftExpr)* |
| 7789 | 7788 | |
| 7790 | | BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)* |
| 7789 | BitShiftExpr &lt;- AdditionExpr (BitShiftOp AdditionExpr)* |
| 7791 | 7790 | |
| 7792 | | AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)* |
| 7791 | AdditionExpr &lt;- MultiplyExpr (AdditionOp MultiplyExpr)* |
| 7793 | 7792 | |
| 7794 | | MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)* |
| 7793 | MultiplyExpr &lt;- PrefixExpr (MultiplyOp PrefixExpr)* |
| 7795 | 7794 | |
| 7796 | | PrefixExpr <- PrefixOp* PrimaryExpr |
| 7795 | PrefixExpr &lt;- PrefixOp* PrimaryExpr |
| 7797 | 7796 | |
| 7798 | 7797 | PrimaryExpr |
| 7799 | | <- AsmExpr |
| 7798 | &lt;- AsmExpr |
| 7800 | 7799 | / IfExpr |
| 7801 | 7800 | / KEYWORD_break BreakLabel? Expr? |
| 7802 | 7801 | / KEYWORD_cancel Expr |
| ... | ... | @@ -7807,35 +7806,35 @@ PrimaryExpr |
| 7807 | 7806 | / LabeledExpr |
| 7808 | 7807 | / CurlySuffixExpr |
| 7809 | 7808 | |
| 7810 | | IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)? |
| 7809 | IfExpr &lt;- IfPrefix Expr (KEYWORD_else Payload? Expr)? |
| 7811 | 7810 | |
| 7812 | | LabeledExpr <- BlockLabel? (Block / LoopExpr) |
| 7811 | LabeledExpr &lt;- BlockLabel? (Block / LoopExpr) |
| 7813 | 7812 | |
| 7814 | | Block <- LBRACE Statement* RBRACE |
| 7813 | Block &lt;- LBRACE Statement* RBRACE |
| 7815 | 7814 | |
| 7816 | | LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr) |
| 7815 | LoopExpr &lt;- KEYWORD_inline? (ForExpr / WhileExpr) |
| 7817 | 7816 | |
| 7818 | | ForExpr <- ForPrefix Expr (KEYWORD_else Expr)? |
| 7817 | ForExpr &lt;- ForPrefix Expr (KEYWORD_else Expr)? |
| 7819 | 7818 | |
| 7820 | | WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)? |
| 7819 | WhileExpr &lt;- WhilePrefix Expr (KEYWORD_else Payload? Expr)? |
| 7821 | 7820 | |
| 7822 | | CurlySuffixExpr <- TypeExpr InitList? |
| 7821 | CurlySuffixExpr &lt;- TypeExpr InitList? |
| 7823 | 7822 | |
| 7824 | 7823 | InitList |
| 7825 | | <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE |
| 7824 | &lt;- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE |
| 7826 | 7825 | / LBRACE Expr (COMMA Expr)* COMMA? RBRACE |
| 7827 | 7826 | / LBRACE RBRACE |
| 7828 | 7827 | |
| 7829 | | TypeExpr <- PrefixTypeOp* ErrorUnionExpr |
| 7828 | TypeExpr &lt;- PrefixTypeOp* ErrorUnionExpr |
| 7830 | 7829 | |
| 7831 | | ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)? |
| 7830 | ErrorUnionExpr &lt;- SuffixExpr (EXCLAMATIONMARK TypeExpr)? |
| 7832 | 7831 | |
| 7833 | 7832 | SuffixExpr |
| 7834 | | <- AsyncPrefix PrimaryTypeExpr SuffixOp* FnCallArgumnets |
| 7833 | &lt;- AsyncPrefix PrimaryTypeExpr SuffixOp* FnCallArgumnets |
| 7835 | 7834 | / PrimaryTypeExpr (SuffixOp / FnCallArgumnets)* |
| 7836 | 7835 | |
| 7837 | 7836 | PrimaryTypeExpr |
| 7838 | | <- BUILTININDENTIFIER FnCallArgumnets |
| 7837 | &lt;- BUILTININDENTIFIER FnCallArgumnets |
| 7839 | 7838 | / CHAR_LITERAL |
| 7840 | 7839 | / ContainerDecl |
| 7841 | 7840 | / ErrorSetDecl |
| ... | ... | @@ -7858,91 +7857,91 @@ PrimaryTypeExpr |
| 7858 | 7857 | / STRINGLITERAL |
| 7859 | 7858 | / SwitchExpr |
| 7860 | 7859 | |
| 7861 | | ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto |
| 7860 | ContainerDecl &lt;- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto |
| 7862 | 7861 | |
| 7863 | | ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE |
| 7862 | ErrorSetDecl &lt;- KEYWORD_error LBRACE IdentifierList RBRACE |
| 7864 | 7863 | |
| 7865 | | GroupedExpr <- LPAREN Expr RPAREN |
| 7864 | GroupedExpr &lt;- LPAREN Expr RPAREN |
| 7866 | 7865 | |
| 7867 | | IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? |
| 7866 | IfTypeExpr &lt;- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? |
| 7868 | 7867 | |
| 7869 | 7868 | LabeledTypeExpr |
| 7870 | | <- BlockLabel Block |
| 7869 | &lt;- BlockLabel Block |
| 7871 | 7870 | / BlockLabel? LoopTypeExpr |
| 7872 | 7871 | |
| 7873 | | LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) |
| 7872 | LoopTypeExpr &lt;- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr) |
| 7874 | 7873 | |
| 7875 | | ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? |
| 7874 | ForTypeExpr &lt;- ForPrefix TypeExpr (KEYWORD_else TypeExpr)? |
| 7876 | 7875 | |
| 7877 | | WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? |
| 7876 | WhileTypeExpr &lt;- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)? |
| 7878 | 7877 | |
| 7879 | | SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE |
| 7878 | SwitchExpr &lt;- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE |
| 7880 | 7879 | |
| 7881 | 7880 | # *** Assembly *** |
| 7882 | | AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN STRINGLITERAL AsmOutput? RPAREN |
| 7881 | AsmExpr &lt;- KEYWORD_asm KEYWORD_volatile? LPAREN STRINGLITERAL AsmOutput? RPAREN |
| 7883 | 7882 | |
| 7884 | | AsmOutput <- COLON AsmOutputList AsmInput? |
| 7883 | AsmOutput &lt;- COLON AsmOutputList AsmInput? |
| 7885 | 7884 | |
| 7886 | | AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN |
| 7885 | AsmOutputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN |
| 7887 | 7886 | |
| 7888 | | AsmInput <- COLON AsmInputList AsmCloppers? |
| 7887 | AsmInput &lt;- COLON AsmInputList AsmCloppers? |
| 7889 | 7888 | |
| 7890 | | AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN |
| 7889 | AsmInputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN |
| 7891 | 7890 | |
| 7892 | | AsmCloppers <- COLON StringList |
| 7891 | AsmCloppers &lt;- COLON StringList |
| 7893 | 7892 | |
| 7894 | 7893 | # *** Helper grammar *** |
| 7895 | | BreakLabel <- COLON IDENTIFIER |
| 7894 | BreakLabel &lt;- COLON IDENTIFIER |
| 7896 | 7895 | |
| 7897 | | BlockLabel <- IDENTIFIER COLON |
| 7896 | BlockLabel &lt;- IDENTIFIER COLON |
| 7898 | 7897 | |
| 7899 | | FieldInit <- DOT IDENTIFIER EQUAL Expr |
| 7898 | FieldInit &lt;- DOT IDENTIFIER EQUAL Expr |
| 7900 | 7899 | |
| 7901 | | WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN |
| 7900 | WhileContinueExpr &lt;- COLON LPAREN AssignExpr RPAREN |
| 7902 | 7901 | |
| 7903 | | Section <- KEYWORD_section LPAREN Expr RPAREN |
| 7902 | LinkSection &lt;- KEYWORD_linksection LPAREN Expr RPAREN |
| 7904 | 7903 | |
| 7905 | 7904 | # Fn specific |
| 7906 | 7905 | FnCC |
| 7907 | | <- KEYWORD_nakedcc |
| 7906 | &lt;- KEYWORD_nakedcc |
| 7908 | 7907 | / KEYWORD_stdcallcc |
| 7909 | 7908 | / KEYWORD_extern |
| 7910 | 7909 | / KEYWORD_async (LARROW TypeExpr RARROW)? |
| 7911 | 7910 | |
| 7912 | | ParamDecl <- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType |
| 7911 | ParamDecl &lt;- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType |
| 7913 | 7912 | |
| 7914 | 7913 | ParamType |
| 7915 | | <- KEYWORD_var |
| 7914 | &lt;- KEYWORD_var |
| 7916 | 7915 | / DOT3 |
| 7917 | 7916 | / TypeExpr |
| 7918 | 7917 | |
| 7919 | 7918 | # Control flow prefixes |
| 7920 | | IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload? |
| 7919 | IfPrefix &lt;- KEYWORD_if LPAREN Expr RPAREN PtrPayload? |
| 7921 | 7920 | |
| 7922 | | WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? |
| 7921 | WhilePrefix &lt;- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr? |
| 7923 | 7922 | |
| 7924 | | ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload |
| 7923 | ForPrefix &lt;- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload |
| 7925 | 7924 | |
| 7926 | 7925 | # Payloads |
| 7927 | | Payload <- PIPE IDENTIFIER PIPE |
| 7926 | Payload &lt;- PIPE IDENTIFIER PIPE |
| 7928 | 7927 | |
| 7929 | | PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE |
| 7928 | PtrPayload &lt;- PIPE ASTERISK? IDENTIFIER PIPE |
| 7930 | 7929 | |
| 7931 | | PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE |
| 7930 | PtrIndexPayload &lt;- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE |
| 7932 | 7931 | |
| 7933 | 7932 | |
| 7934 | 7933 | # Switch specific |
| 7935 | | SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr |
| 7934 | SwitchProng &lt;- SwitchCase EQUALRARROW PtrPayload? AssignExpr |
| 7936 | 7935 | |
| 7937 | 7936 | SwitchCase |
| 7938 | | <- SwitchItem (COMMA SwitchItem)* COMMA? |
| 7937 | &lt;- SwitchItem (COMMA SwitchItem)* COMMA? |
| 7939 | 7938 | / KEYWORD_else |
| 7940 | 7939 | |
| 7941 | | SwitchItem <- Expr (DOT3 Expr)? |
| 7940 | SwitchItem &lt;- Expr (DOT3 Expr)? |
| 7942 | 7941 | |
| 7943 | 7942 | # Operators |
| 7944 | 7943 | AssignOp |
| 7945 | | <- ASTERISKEQUAL |
| 7944 | &lt;- ASTERISKEQUAL |
| 7946 | 7945 | / SLASHEQUAL |
| 7947 | 7946 | / PERCENTEQUAL |
| 7948 | 7947 | / PLUSEQUAL |
| ... | ... | @@ -7958,7 +7957,7 @@ AssignOp |
| 7958 | 7957 | / EQUAL |
| 7959 | 7958 | |
| 7960 | 7959 | CompareOp |
| 7961 | | <- EQUALEQUAL |
| 7960 | &lt;- EQUALEQUAL |
| 7962 | 7961 | / EXCLAMATIONMARKEQUAL |
| 7963 | 7962 | / LARROW |
| 7964 | 7963 | / RARROW |
| ... | ... | @@ -7966,25 +7965,25 @@ CompareOp |
| 7966 | 7965 | / RARROWEQUAL |
| 7967 | 7966 | |
| 7968 | 7967 | BitwiseOp |
| 7969 | | <- AMPERSAND |
| 7968 | &lt;- AMPERSAND |
| 7970 | 7969 | / CARET |
| 7971 | 7970 | / PIPE |
| 7972 | 7971 | / KEYWORD_orelse |
| 7973 | 7972 | / KEYWORD_catch Payload? |
| 7974 | 7973 | |
| 7975 | 7974 | BitShiftOp |
| 7976 | | <- LARROW2 |
| 7975 | &lt;- LARROW2 |
| 7977 | 7976 | / RARROW2 |
| 7978 | 7977 | |
| 7979 | 7978 | AdditionOp |
| 7980 | | <- PLUS |
| 7979 | &lt;- PLUS |
| 7981 | 7980 | / MINUS |
| 7982 | 7981 | / PLUS2 |
| 7983 | 7982 | / PLUSPERCENT |
| 7984 | 7983 | / MINUSPERCENT |
| 7985 | 7984 | |
| 7986 | 7985 | MultiplyOp |
| 7987 | | <- PIPE2 |
| 7986 | &lt;- PIPE2 |
| 7988 | 7987 | / ASTERISK |
| 7989 | 7988 | / SLASH |
| 7990 | 7989 | / PERCENT |
| ... | ... | @@ -7992,7 +7991,7 @@ MultiplyOp |
| 7992 | 7991 | / ASTERISKPERCENT |
| 7993 | 7992 | |
| 7994 | 7993 | PrefixOp |
| 7995 | | <- EXCLAMATIONMARK |
| 7994 | &lt;- EXCLAMATIONMARK |
| 7996 | 7995 | / MINUS |
| 7997 | 7996 | / TILDE |
| 7998 | 7997 | / MINUSPERCENT |
| ... | ... | @@ -8001,77 +8000,77 @@ PrefixOp |
| 8001 | 8000 | / KEYWORD_await |
| 8002 | 8001 | |
| 8003 | 8002 | PrefixTypeOp |
| 8004 | | <- QUESTIONMARK |
| 8003 | &lt;- QUESTIONMARK |
| 8005 | 8004 | / KEYWORD_promise MINUSRARROW |
| 8006 | 8005 | / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile)* |
| 8007 | 8006 | / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile)* |
| 8008 | 8007 | |
| 8009 | 8008 | SuffixOp |
| 8010 | | <- LBRACKET Expr (DOT2 Expr?)? RBRACKET |
| 8009 | &lt;- LBRACKET Expr (DOT2 Expr?)? RBRACKET |
| 8011 | 8010 | / DOT IDENTIFIER |
| 8012 | 8011 | / DOTASTERISK |
| 8013 | 8012 | / DOTQUESTIONMARK |
| 8014 | 8013 | |
| 8015 | | AsyncPrefix <- KEYWORD_async (LARROW PrefixExpr RARROW)? |
| 8014 | AsyncPrefix &lt;- KEYWORD_async (LARROW PrefixExpr RARROW)? |
| 8016 | 8015 | |
| 8017 | | FnCallArgumnets <- LPAREN ExprList RPAREN |
| 8016 | FnCallArgumnets &lt;- LPAREN ExprList RPAREN |
| 8018 | 8017 | |
| 8019 | 8018 | # Ptr specific |
| 8020 | | ArrayTypeStart <- LBRACKET Expr? RBRACKET |
| 8019 | ArrayTypeStart &lt;- LBRACKET Expr? RBRACKET |
| 8021 | 8020 | |
| 8022 | 8021 | PtrTypeStart |
| 8023 | | <- ASTERISK |
| 8022 | &lt;- ASTERISK |
| 8024 | 8023 | / ASTERISK2 |
| 8025 | 8024 | / LBRACKET ASTERISK RBRACKET |
| 8026 | 8025 | |
| 8027 | 8026 | # ContainerDecl specific |
| 8028 | | ContainerDeclAuto <- ContainerDeclType LBRACE ContainerMembers RBRACE |
| 8027 | ContainerDeclAuto &lt;- ContainerDeclType LBRACE ContainerMembers RBRACE |
| 8029 | 8028 | |
| 8030 | 8029 | ContainerDeclType |
| 8031 | | <- (KEYWORD_struct / KEYWORD_enum) (LPAREN Expr RPAREN)? |
| 8030 | &lt;- (KEYWORD_struct / KEYWORD_enum) (LPAREN Expr RPAREN)? |
| 8032 | 8031 | / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)? |
| 8033 | 8032 | |
| 8034 | 8033 | # Alignment |
| 8035 | | ByteAlign <- KEYWORD_align LPAREN Expr RPAREN |
| 8034 | ByteAlign &lt;- KEYWORD_align LPAREN Expr RPAREN |
| 8036 | 8035 | |
| 8037 | 8036 | # Lists |
| 8038 | | IdentifierList <- (IDENTIFIER COMMA)* IDENTIFIER? |
| 8037 | IdentifierList &lt;- (IDENTIFIER COMMA)* IDENTIFIER? |
| 8039 | 8038 | |
| 8040 | | SwitchProngList <- (SwitchProng COMMA)* SwitchProng? |
| 8039 | SwitchProngList &lt;- (SwitchProng COMMA)* SwitchProng? |
| 8041 | 8040 | |
| 8042 | | AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem? |
| 8041 | AsmOutputList &lt;- (AsmOutputItem COMMA)* AsmOutputItem? |
| 8043 | 8042 | |
| 8044 | | AsmInputList <- (AsmInputItem COMMA)* AsmInputItem? |
| 8043 | AsmInputList &lt;- (AsmInputItem COMMA)* AsmInputItem? |
| 8045 | 8044 | |
| 8046 | | StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL? |
| 8045 | StringList &lt;- (STRINGLITERAL COMMA)* STRINGLITERAL? |
| 8047 | 8046 | |
| 8048 | | ParamDeclList <- (ParamDecl COMMA)* ParamDecl? |
| 8047 | ParamDeclList &lt;- (ParamDecl COMMA)* ParamDecl? |
| 8049 | 8048 | |
| 8050 | | ExprList <- (Expr COMMA)* Expr? |
| 8049 | ExprList &lt;- (Expr COMMA)* Expr? |
| 8051 | 8050 | |
| 8052 | 8051 | # *** Tokens *** |
| 8053 | | eof <- !. |
| 8054 | | hex <- [0-9a-fA-F] |
| 8052 | eof &lt;- !. |
| 8053 | hex &lt;- [0-9a-fA-F] |
| 8055 | 8054 | char_escape |
| 8056 | | <- "\\x" hex hex |
| 8055 | &lt;- "\\x" hex hex |
| 8057 | 8056 | / "\\u" hex hex hex hex |
| 8058 | 8057 | / "\\U" hex hex hex hex hex hex |
| 8059 | 8058 | / "\\" [nr\\t'"] |
| 8060 | 8059 | char_char |
| 8061 | | <- char_escape |
| 8060 | &lt;- char_escape |
| 8062 | 8061 | / [^\\'\n] |
| 8063 | 8062 | string_char |
| 8064 | | <- char_escape |
| 8063 | &lt;- char_escape |
| 8065 | 8064 | / [^\\"\n] |
| 8066 | 8065 | |
| 8067 | | line_comment <- '//'[^\n]* |
| 8068 | | line_string <- ("\\\\" [^\n]* [ \n]*)+ |
| 8069 | | line_cstring <- ("c\\\\" [^\n]* [ \n]*)+ |
| 8070 | | skip <- ([ \n] / line_comment)* |
| 8066 | line_comment &lt;- '//'[^\n]* |
| 8067 | line_string &lt;- ("\\\\" [^\n]* [ \n]*)+ |
| 8068 | line_cstring &lt;- ("c\\\\" [^\n]* [ \n]*)+ |
| 8069 | skip &lt;- ([ \n] / line_comment)* |
| 8071 | 8070 | |
| 8072 | | CHAR_LITERAL <- "'" char_char "'" skip |
| 8071 | CHAR_LITERAL &lt;- "'" char_char "'" skip |
| 8073 | 8072 | FLOAT |
| 8074 | | <- "0b" [01]+ "." [01]+ ([eE] [-+]? [01]+)? skip |
| 8073 | &lt;- "0b" [01]+ "." [01]+ ([eE] [-+]? [01]+)? skip |
| 8075 | 8074 | / "0o" [0-7]+ "." [0-7]+ ([eE] [-+]? [0-7]+)? skip |
| 8076 | 8075 | / "0x" hex+ "." hex+ ([pP] [-+]? hex+)? skip |
| 8077 | 8076 | / [0-9]+ "." [0-9]+ ([eE] [-+]? [0-9]+)? skip |
| ... | ... | @@ -8080,128 +8079,128 @@ FLOAT |
| 8080 | 8079 | / "0x" hex+ "."? [pP] [-+]? hex+ skip |
| 8081 | 8080 | / [0-9]+ "."? [eE] [-+]? [0-9]+ skip |
| 8082 | 8081 | INTEGER |
| 8083 | | <- "0b" [01]+ skip |
| 8082 | &lt;- "0b" [01]+ skip |
| 8084 | 8083 | / "0o" [0-7]+ skip |
| 8085 | 8084 | / "0x" hex+ skip |
| 8086 | 8085 | / [0-9]+ skip |
| 8087 | 8086 | STRINGLITERAL |
| 8088 | | <- "c"? "\"" string_char* "\"" skip |
| 8087 | &lt;- "c"? "\"" string_char* "\"" skip |
| 8089 | 8088 | / line_string skip |
| 8090 | 8089 | / line_cstring skip |
| 8091 | 8090 | IDENTIFIER |
| 8092 | | <- !keyword ("c" !["\\] / [A-Zabd-z_]) [A-Za-z0-9_]* skip |
| 8091 | &lt;- !keyword ("c" !["\\] / [A-Zabd-z_]) [A-Za-z0-9_]* skip |
| 8093 | 8092 | / "@\"" string_char* "\"" skip |
| 8094 | | BUILTININDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip |
| 8095 | | |
| 8096 | | |
| 8097 | | AMPERSAND <- '&' ![=] skip |
| 8098 | | AMPERSANDEQUAL <- '&=' skip |
| 8099 | | ASTERISK <- '*' ![*%=] skip |
| 8100 | | ASTERISK2 <- '**' skip |
| 8101 | | ASTERISKEQUAL <- '*=' skip |
| 8102 | | ASTERISKPERCENT <- '*%' ![=] skip |
| 8103 | | ASTERISKPERCENTEQUAL <- '*%=' skip |
| 8104 | | CARET <- '^' ![=] skip |
| 8105 | | CARETEQUAL <- '^=' skip |
| 8106 | | COLON <- ':' skip |
| 8107 | | COMMA <- ',' skip |
| 8108 | | DOT <- '.' ![*.?] skip |
| 8109 | | DOT2 <- '..' ![.] skip |
| 8110 | | DOT3 <- '...' skip |
| 8111 | | DOTASTERISK <- '.*' skip |
| 8112 | | DOTQUESTIONMARK <- '.?' skip |
| 8113 | | EQUAL <- '=' ![>=] skip |
| 8114 | | EQUALEQUAL <- '==' skip |
| 8115 | | EQUALRARROW <- '=>' skip |
| 8116 | | EXCLAMATIONMARK <- '!' ![=] skip |
| 8117 | | EXCLAMATIONMARKEQUAL <- '!=' skip |
| 8118 | | LARROW <- '<' ![<=] skip |
| 8119 | | LARROW2 <- '<<' ![=] skip |
| 8120 | | LARROW2EQUAL <- '<<=' skip |
| 8121 | | LARROWEQUAL <- '<=' skip |
| 8122 | | LBRACE <- '{' skip |
| 8123 | | LBRACKET <- '[' skip |
| 8124 | | LPAREN <- '(' skip |
| 8125 | | MINUS <- '-' ![%=>] skip |
| 8126 | | MINUSEQUAL <- '-=' skip |
| 8127 | | MINUSPERCENT <- '-%' ![=] skip |
| 8128 | | MINUSPERCENTEQUAL <- '-%=' skip |
| 8129 | | MINUSRARROW <- '->' skip |
| 8130 | | PERCENT <- '%' ![=] skip |
| 8131 | | PERCENTEQUAL <- '%=' skip |
| 8132 | | PIPE <- '|' ![|=] skip |
| 8133 | | PIPE2 <- '||' skip |
| 8134 | | PIPEEQUAL <- '|=' skip |
| 8135 | | PLUS <- '+' ![%+=] skip |
| 8136 | | PLUS2 <- '++' skip |
| 8137 | | PLUSEQUAL <- '+=' skip |
| 8138 | | PLUSPERCENT <- '+%' ![=] skip |
| 8139 | | PLUSPERCENTEQUAL <- '+%=' skip |
| 8140 | | QUESTIONMARK <- '?' skip |
| 8141 | | RARROW <- '>' ![>=] skip |
| 8142 | | RARROW2 <- '>>' ![=] skip |
| 8143 | | RARROW2EQUAL <- '>>=' skip |
| 8144 | | RARROWEQUAL <- '>=' skip |
| 8145 | | RBRACE <- '}' skip |
| 8146 | | RBRACKET <- ']' skip |
| 8147 | | RPAREN <- ')' skip |
| 8148 | | SEMICOLON <- ';' skip |
| 8149 | | SLASH <- '/' ![=] skip |
| 8150 | | SLASHEQUAL <- '/=' skip |
| 8151 | | TILDE <- '~' skip |
| 8152 | | |
| 8153 | | end_of_word <- ![a-zA-Z0-9_] skip |
| 8154 | | KEYWORD_align <- 'align' end_of_word |
| 8155 | | KEYWORD_and <- 'and' end_of_word |
| 8156 | | KEYWORD_anyerror <- 'anyerror' end_of_word |
| 8157 | | KEYWORD_asm <- 'asm' end_of_word |
| 8158 | | KEYWORD_async <- 'async' end_of_word |
| 8159 | | KEYWORD_await <- 'await' end_of_word |
| 8160 | | KEYWORD_break <- 'break' end_of_word |
| 8161 | | KEYWORD_cancel <- 'cancel' end_of_word |
| 8162 | | KEYWORD_catch <- 'catch' end_of_word |
| 8163 | | KEYWORD_comptime <- 'comptime' end_of_word |
| 8164 | | KEYWORD_const <- 'const' end_of_word |
| 8165 | | KEYWORD_continue <- 'continue' end_of_word |
| 8166 | | KEYWORD_defer <- 'defer' end_of_word |
| 8167 | | KEYWORD_else <- 'else' end_of_word |
| 8168 | | KEYWORD_enum <- 'enum' end_of_word |
| 8169 | | KEYWORD_errdefer <- 'errdefer' end_of_word |
| 8170 | | KEYWORD_error <- 'error' end_of_word |
| 8171 | | KEYWORD_export <- 'export' end_of_word |
| 8172 | | KEYWORD_extern <- 'extern' end_of_word |
| 8173 | | KEYWORD_false <- 'false' end_of_word |
| 8174 | | KEYWORD_fn <- 'fn' end_of_word |
| 8175 | | KEYWORD_for <- 'for' end_of_word |
| 8176 | | KEYWORD_if <- 'if' end_of_word |
| 8177 | | KEYWORD_inline <- 'inline' end_of_word |
| 8178 | | KEYWORD_nakedcc <- 'nakedcc' end_of_word |
| 8179 | | KEYWORD_noalias <- 'noalias' end_of_word |
| 8180 | | KEYWORD_null <- 'null' end_of_word |
| 8181 | | KEYWORD_or <- 'or' end_of_word |
| 8182 | | KEYWORD_orelse <- 'orelse' end_of_word |
| 8183 | | KEYWORD_packed <- 'packed' end_of_word |
| 8184 | | KEYWORD_promise <- 'promise' end_of_word |
| 8185 | | KEYWORD_pub <- 'pub' end_of_word |
| 8186 | | KEYWORD_resume <- 'resume' end_of_word |
| 8187 | | KEYWORD_return <- 'return' end_of_word |
| 8188 | | KEYWORD_section <- 'section' end_of_word |
| 8189 | | KEYWORD_stdcallcc <- 'stdcallcc' end_of_word |
| 8190 | | KEYWORD_struct <- 'struct' end_of_word |
| 8191 | | KEYWORD_suspend <- 'suspend' end_of_word |
| 8192 | | KEYWORD_switch <- 'switch' end_of_word |
| 8193 | | KEYWORD_test <- 'test' end_of_word |
| 8194 | | KEYWORD_true <- 'true' end_of_word |
| 8195 | | KEYWORD_try <- 'try' end_of_word |
| 8196 | | KEYWORD_undefined <- 'undefined' end_of_word |
| 8197 | | KEYWORD_union <- 'union' end_of_word |
| 8198 | | KEYWORD_unreachable <- 'unreachable' end_of_word |
| 8199 | | KEYWORD_use <- 'use' end_of_word |
| 8200 | | KEYWORD_var <- 'var' end_of_word |
| 8201 | | KEYWORD_volatile <- 'volatile' end_of_word |
| 8202 | | KEYWORD_while <- 'while' end_of_word |
| 8203 | | |
| 8204 | | keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm |
| 8093 | BUILTININDENTIFIER &lt;- "@"[A-Za-z_][A-Za-z0-9_]* skip |
| 8094 | |
| 8095 | |
| 8096 | AMPERSAND &lt;- '&' ![=] skip |
| 8097 | AMPERSANDEQUAL &lt;- '&=' skip |
| 8098 | ASTERISK &lt;- '*' ![*%=] skip |
| 8099 | ASTERISK2 &lt;- '**' skip |
| 8100 | ASTERISKEQUAL &lt;- '*=' skip |
| 8101 | ASTERISKPERCENT &lt;- '*%' ![=] skip |
| 8102 | ASTERISKPERCENTEQUAL &lt;- '*%=' skip |
| 8103 | CARET &lt;- '^' ![=] skip |
| 8104 | CARETEQUAL &lt;- '^=' skip |
| 8105 | COLON &lt;- ':' skip |
| 8106 | COMMA &lt;- ',' skip |
| 8107 | DOT &lt;- '.' ![*.?] skip |
| 8108 | DOT2 &lt;- '..' ![.] skip |
| 8109 | DOT3 &lt;- '...' skip |
| 8110 | DOTASTERISK &lt;- '.*' skip |
| 8111 | DOTQUESTIONMARK &lt;- '.?' skip |
| 8112 | EQUAL &lt;- '=' ![>=] skip |
| 8113 | EQUALEQUAL &lt;- '==' skip |
| 8114 | EQUALRARROW &lt;- '=>' skip |
| 8115 | EXCLAMATIONMARK &lt;- '!' ![=] skip |
| 8116 | EXCLAMATIONMARKEQUAL &lt;- '!=' skip |
| 8117 | LARROW &lt;- '&lt;' ![&lt;=] skip |
| 8118 | LARROW2 &lt;- '&lt;&lt;' ![=] skip |
| 8119 | LARROW2EQUAL &lt;- '&lt;&lt;=' skip |
| 8120 | LARROWEQUAL &lt;- '&lt;=' skip |
| 8121 | LBRACE &lt;- '{' skip |
| 8122 | LBRACKET &lt;- '[' skip |
| 8123 | LPAREN &lt;- '(' skip |
| 8124 | MINUS &lt;- '-' ![%=>] skip |
| 8125 | MINUSEQUAL &lt;- '-=' skip |
| 8126 | MINUSPERCENT &lt;- '-%' ![=] skip |
| 8127 | MINUSPERCENTEQUAL &lt;- '-%=' skip |
| 8128 | MINUSRARROW &lt;- '->' skip |
| 8129 | PERCENT &lt;- '%' ![=] skip |
| 8130 | PERCENTEQUAL &lt;- '%=' skip |
| 8131 | PIPE &lt;- '|' ![|=] skip |
| 8132 | PIPE2 &lt;- '||' skip |
| 8133 | PIPEEQUAL &lt;- '|=' skip |
| 8134 | PLUS &lt;- '+' ![%+=] skip |
| 8135 | PLUS2 &lt;- '++' skip |
| 8136 | PLUSEQUAL &lt;- '+=' skip |
| 8137 | PLUSPERCENT &lt;- '+%' ![=] skip |
| 8138 | PLUSPERCENTEQUAL &lt;- '+%=' skip |
| 8139 | QUESTIONMARK &lt;- '?' skip |
| 8140 | RARROW &lt;- '>' ![>=] skip |
| 8141 | RARROW2 &lt;- '>>' ![=] skip |
| 8142 | RARROW2EQUAL &lt;- '>>=' skip |
| 8143 | RARROWEQUAL &lt;- '>=' skip |
| 8144 | RBRACE &lt;- '}' skip |
| 8145 | RBRACKET &lt;- ']' skip |
| 8146 | RPAREN &lt;- ')' skip |
| 8147 | SEMICOLON &lt;- ';' skip |
| 8148 | SLASH &lt;- '/' ![=] skip |
| 8149 | SLASHEQUAL &lt;- '/=' skip |
| 8150 | TILDE &lt;- '~' skip |
| 8151 | |
| 8152 | end_of_word &lt;- ![a-zA-Z0-9_] skip |
| 8153 | KEYWORD_align &lt;- 'align' end_of_word |
| 8154 | KEYWORD_and &lt;- 'and' end_of_word |
| 8155 | KEYWORD_anyerror &lt;- 'anyerror' end_of_word |
| 8156 | KEYWORD_asm &lt;- 'asm' end_of_word |
| 8157 | KEYWORD_async &lt;- 'async' end_of_word |
| 8158 | KEYWORD_await &lt;- 'await' end_of_word |
| 8159 | KEYWORD_break &lt;- 'break' end_of_word |
| 8160 | KEYWORD_cancel &lt;- 'cancel' end_of_word |
| 8161 | KEYWORD_catch &lt;- 'catch' end_of_word |
| 8162 | KEYWORD_comptime &lt;- 'comptime' end_of_word |
| 8163 | KEYWORD_const &lt;- 'const' end_of_word |
| 8164 | KEYWORD_continue &lt;- 'continue' end_of_word |
| 8165 | KEYWORD_defer &lt;- 'defer' end_of_word |
| 8166 | KEYWORD_else &lt;- 'else' end_of_word |
| 8167 | KEYWORD_enum &lt;- 'enum' end_of_word |
| 8168 | KEYWORD_errdefer &lt;- 'errdefer' end_of_word |
| 8169 | KEYWORD_error &lt;- 'error' end_of_word |
| 8170 | KEYWORD_export &lt;- 'export' end_of_word |
| 8171 | KEYWORD_extern &lt;- 'extern' end_of_word |
| 8172 | KEYWORD_false &lt;- 'false' end_of_word |
| 8173 | KEYWORD_fn &lt;- 'fn' end_of_word |
| 8174 | KEYWORD_for &lt;- 'for' end_of_word |
| 8175 | KEYWORD_if &lt;- 'if' end_of_word |
| 8176 | KEYWORD_inline &lt;- 'inline' end_of_word |
| 8177 | KEYWORD_nakedcc &lt;- 'nakedcc' end_of_word |
| 8178 | KEYWORD_noalias &lt;- 'noalias' end_of_word |
| 8179 | KEYWORD_null &lt;- 'null' end_of_word |
| 8180 | KEYWORD_or &lt;- 'or' end_of_word |
| 8181 | KEYWORD_orelse &lt;- 'orelse' end_of_word |
| 8182 | KEYWORD_packed &lt;- 'packed' end_of_word |
| 8183 | KEYWORD_promise &lt;- 'promise' end_of_word |
| 8184 | KEYWORD_pub &lt;- 'pub' end_of_word |
| 8185 | KEYWORD_resume &lt;- 'resume' end_of_word |
| 8186 | KEYWORD_return &lt;- 'return' end_of_word |
| 8187 | KEYWORD_linksection &lt;- 'linksection' end_of_word |
| 8188 | KEYWORD_stdcallcc &lt;- 'stdcallcc' end_of_word |
| 8189 | KEYWORD_struct &lt;- 'struct' end_of_word |
| 8190 | KEYWORD_suspend &lt;- 'suspend' end_of_word |
| 8191 | KEYWORD_switch &lt;- 'switch' end_of_word |
| 8192 | KEYWORD_test &lt;- 'test' end_of_word |
| 8193 | KEYWORD_true &lt;- 'true' end_of_word |
| 8194 | KEYWORD_try &lt;- 'try' end_of_word |
| 8195 | KEYWORD_undefined &lt;- 'undefined' end_of_word |
| 8196 | KEYWORD_union &lt;- 'union' end_of_word |
| 8197 | KEYWORD_unreachable &lt;- 'unreachable' end_of_word |
| 8198 | KEYWORD_use &lt;- 'use' end_of_word |
| 8199 | KEYWORD_var &lt;- 'var' end_of_word |
| 8200 | KEYWORD_volatile &lt;- 'volatile' end_of_word |
| 8201 | KEYWORD_while &lt;- 'while' end_of_word |
| 8202 | |
| 8203 | keyword &lt;- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm |
| 8205 | 8204 | / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_cancel |
| 8206 | 8205 | / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue |
| 8207 | 8206 | / KEYWORD_defer / KEYWORD_else / KEYWORD_enum / KEYWORD_errdefer |
| ... | ... | @@ -8209,12 +8208,11 @@ keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm |
| 8209 | 8208 | / KEYWORD_fn / KEYWORD_for / KEYWORD_if / KEYWORD_inline |
| 8210 | 8209 | / KEYWORD_nakedcc / KEYWORD_noalias / KEYWORD_null / KEYWORD_or |
| 8211 | 8210 | / KEYWORD_orelse / KEYWORD_packed / KEYWORD_promise / KEYWORD_pub |
| 8212 | | / KEYWORD_resume / KEYWORD_return / KEYWORD_section |
| 8211 | / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection |
| 8213 | 8212 | / KEYWORD_stdcallcc / KEYWORD_struct / KEYWORD_suspend |
| 8214 | 8213 | / KEYWORD_switch / KEYWORD_test / KEYWORD_true / KEYWORD_try |
| 8215 | 8214 | / KEYWORD_undefined / KEYWORD_union / KEYWORD_unreachable |
| 8216 | | / KEYWORD_use / KEYWORD_var / KEYWORD_volatile / KEYWORD_while |
| 8217 | | </code></pre> |
| 8215 | / KEYWORD_use / KEYWORD_var / KEYWORD_volatile / KEYWORD_while</code></pre> |
| 8218 | 8216 | {#header_close#} |
| 8219 | 8217 | {#header_open|Zen#} |
| 8220 | 8218 | <ul> |