authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-17 01:38:35-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-11-17 01:38:35-05:00
log704374e51294e14285b0b54030c1cb6154868098
treea0e33d754ab4b5fe84961a48711cdeff23dc858b
parent38629628814aae6ba09bc2c25fdbac407a5d9e17
signature Commit is signed but in an unrecognized format.

rename `section` keyword to `linksection`

add zig fmt support for this syntax closes #1152

11 files changed, 314 insertions(+), 240 deletions(-)

doc/docgen.zig+1-1
...@@ -764,7 +764,7 @@ fn tokenizeAndPrintRaw(docgen_tokenizer: *Tokenizer, out: var, source_token: Tok...@@ -764,7 +764,7 @@ fn tokenizeAndPrintRaw(docgen_tokenizer: *Tokenizer, out: var, source_token: Tok
764 std.zig.Token.Id.Keyword_pub,764 std.zig.Token.Id.Keyword_pub,
765 std.zig.Token.Id.Keyword_resume,765 std.zig.Token.Id.Keyword_resume,
766 std.zig.Token.Id.Keyword_return,766 std.zig.Token.Id.Keyword_return,
767 std.zig.Token.Id.Keyword_section,767 std.zig.Token.Id.Keyword_linksection,
768 std.zig.Token.Id.Keyword_stdcallcc,768 std.zig.Token.Id.Keyword_stdcallcc,
769 std.zig.Token.Id.Keyword_struct,769 std.zig.Token.Id.Keyword_struct,
770 std.zig.Token.Id.Keyword_suspend,770 std.zig.Token.Id.Keyword_suspend,
doc/langref.html.in+221-223
...@@ -7713,36 +7713,35 @@ fn readU32Be() u32 {}...@@ -7713,36 +7713,35 @@ fn readU32Be() u32 {}
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>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 {#header_close#}7714 {#header_close#}
7715 {#header_open|Grammar#}7715 {#header_open|Grammar#}
7716 <pre><code class="nohighlight">7716 <pre><code>Root &lt;- skip ContainerMembers eof
7717Root <- skip ContainerMembers eof
77187717
7719# *** Top level ***7718# *** Top level ***
7720ContainerMembers7719ContainerMembers
7721 <- TestDecl ContainerMembers7720 &lt;- TestDecl ContainerMembers
7722 / TopLevelComptime ContainerMembers7721 / TopLevelComptime ContainerMembers
7723 / KEYWORD_pub? TopLevelDecl ContainerMembers7722 / KEYWORD_pub? TopLevelDecl ContainerMembers
7724 / KEYWORD_pub? ContainerField COMMA ContainerMembers7723 / KEYWORD_pub? ContainerField COMMA ContainerMembers
7725 / KEYWORD_pub? ContainerField7724 / KEYWORD_pub? ContainerField
7726 /7725 /
77277726
7728TestDecl <- KEYWORD_test STRINGLITERAL Block7727TestDecl &lt;- KEYWORD_test STRINGLITERAL Block
77297728
7730TopLevelComptime <- KEYWORD_comptime BlockExpr7729TopLevelComptime &lt;- KEYWORD_comptime BlockExpr
77317730
7732TopLevelDecl7731TopLevelDecl
7733 <- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / KEYWORD_inline)? FnProto (SEMICOLON / Block)7732 &lt;- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / KEYWORD_inline)? FnProto (SEMICOLON / Block)
7734 / (KEYWORD_export / KEYWORD_extern STRINGLITERAL?)? VarDecl7733 / (KEYWORD_export / KEYWORD_extern STRINGLITERAL?)? VarDecl
7735 / KEYWORD_use Expr SEMICOLON7734 / KEYWORD_use Expr SEMICOLON
77367735
7737FnProto <- FnCC? KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? Section? EXCLAMATIONMARK? (KEYWORD_var / TypeExpr)7736FnProto &lt;- FnCC? KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? EXCLAMATIONMARK? (KEYWORD_var / TypeExpr)
77387737
7739VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? Section? (EQUAL Expr)? SEMICOLON7738VarDecl &lt;- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
77407739
7741ContainerField <- IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)?7740ContainerField &lt;- IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)?
77427741
7743# *** Block Level ***7742# *** Block Level ***
7744Statement7743Statement
7745 <- KEYWORD_comptime? VarDecl7744 &lt;- KEYWORD_comptime? VarDecl
7746 / KEYWORD_comptime BlockExprStatement7745 / KEYWORD_comptime BlockExprStatement
7747 / KEYWORD_suspend (SEMICOLON / BlockExprStatement)7746 / KEYWORD_suspend (SEMICOLON / BlockExprStatement)
7748 / KEYWORD_defer BlockExprStatement7747 / KEYWORD_defer BlockExprStatement
...@@ -7753,50 +7752,50 @@ Statement...@@ -7753,50 +7752,50 @@ Statement
7753 / AssignExpr SEMICOLON7752 / AssignExpr SEMICOLON
77547753
7755IfStatement7754IfStatement
7756 <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?7755 &lt;- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
7757 / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )7756 / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
77587757
7759LabeledStatement <- BlockLabel? (Block / LoopStatement)7758LabeledStatement &lt;- BlockLabel? (Block / LoopStatement)
77607759
7761LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement)7760LoopStatement &lt;- KEYWORD_inline? (ForStatement / WhileStatement)
77627761
7763ForStatement7762ForStatement
7764 <- ForPrefix BlockExpr ( KEYWORD_else Statement )?7763 &lt;- ForPrefix BlockExpr ( KEYWORD_else Statement )?
7765 / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )7764 / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )
77667765
7767WhileStatement7766WhileStatement
7768 <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?7767 &lt;- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
7769 / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )7768 / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
77707769
7771BlockExprStatement7770BlockExprStatement
7772 <- BlockExpr7771 &lt;- BlockExpr
7773 / AssignExpr SEMICOLON7772 / AssignExpr SEMICOLON
77747773
7775BlockExpr <- BlockLabel? Block7774BlockExpr &lt;- BlockLabel? Block
77767775
7777# *** Expression Level ***7776# *** Expression Level ***
7778AssignExpr <- Expr (AssignOp Expr)?7777AssignExpr &lt;- Expr (AssignOp Expr)?
77797778
7780Expr <- KEYWORD_try* BoolOrExpr7779Expr &lt;- KEYWORD_try* BoolOrExpr
77817780
7782BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)*7781BoolOrExpr &lt;- BoolAndExpr (KEYWORD_or BoolAndExpr)*
77837782
7784BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)*7783BoolAndExpr &lt;- CompareExpr (KEYWORD_and CompareExpr)*
77857784
7786CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)?7785CompareExpr &lt;- BitwiseExpr (CompareOp BitwiseExpr)?
77877786
7788BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)*7787BitwiseExpr &lt;- BitShiftExpr (BitwiseOp BitShiftExpr)*
77897788
7790BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)*7789BitShiftExpr &lt;- AdditionExpr (BitShiftOp AdditionExpr)*
77917790
7792AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)*7791AdditionExpr &lt;- MultiplyExpr (AdditionOp MultiplyExpr)*
77937792
7794MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)*7793MultiplyExpr &lt;- PrefixExpr (MultiplyOp PrefixExpr)*
77957794
7796PrefixExpr <- PrefixOp* PrimaryExpr7795PrefixExpr &lt;- PrefixOp* PrimaryExpr
77977796
7798PrimaryExpr7797PrimaryExpr
7799 <- AsmExpr7798 &lt;- AsmExpr
7800 / IfExpr7799 / IfExpr
7801 / KEYWORD_break BreakLabel? Expr?7800 / KEYWORD_break BreakLabel? Expr?
7802 / KEYWORD_cancel Expr7801 / KEYWORD_cancel Expr
...@@ -7807,35 +7806,35 @@ PrimaryExpr...@@ -7807,35 +7806,35 @@ PrimaryExpr
7807 / LabeledExpr7806 / LabeledExpr
7808 / CurlySuffixExpr7807 / CurlySuffixExpr
78097808
7810IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?7809IfExpr &lt;- IfPrefix Expr (KEYWORD_else Payload? Expr)?
78117810
7812LabeledExpr <- BlockLabel? (Block / LoopExpr)7811LabeledExpr &lt;- BlockLabel? (Block / LoopExpr)
78137812
7814Block <- LBRACE Statement* RBRACE7813Block &lt;- LBRACE Statement* RBRACE
78157814
7816LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr)7815LoopExpr &lt;- KEYWORD_inline? (ForExpr / WhileExpr)
78177816
7818ForExpr <- ForPrefix Expr (KEYWORD_else Expr)?7817ForExpr &lt;- ForPrefix Expr (KEYWORD_else Expr)?
78197818
7820WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)?7819WhileExpr &lt;- WhilePrefix Expr (KEYWORD_else Payload? Expr)?
78217820
7822CurlySuffixExpr <- TypeExpr InitList?7821CurlySuffixExpr &lt;- TypeExpr InitList?
78237822
7824InitList7823InitList
7825 <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE7824 &lt;- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
7826 / LBRACE Expr (COMMA Expr)* COMMA? RBRACE7825 / LBRACE Expr (COMMA Expr)* COMMA? RBRACE
7827 / LBRACE RBRACE7826 / LBRACE RBRACE
78287827
7829TypeExpr <- PrefixTypeOp* ErrorUnionExpr7828TypeExpr &lt;- PrefixTypeOp* ErrorUnionExpr
78307829
7831ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)?7830ErrorUnionExpr &lt;- SuffixExpr (EXCLAMATIONMARK TypeExpr)?
78327831
7833SuffixExpr7832SuffixExpr
7834 <- AsyncPrefix PrimaryTypeExpr SuffixOp* FnCallArgumnets7833 &lt;- AsyncPrefix PrimaryTypeExpr SuffixOp* FnCallArgumnets
7835 / PrimaryTypeExpr (SuffixOp / FnCallArgumnets)*7834 / PrimaryTypeExpr (SuffixOp / FnCallArgumnets)*
78367835
7837PrimaryTypeExpr7836PrimaryTypeExpr
7838 <- BUILTININDENTIFIER FnCallArgumnets7837 &lt;- BUILTININDENTIFIER FnCallArgumnets
7839 / CHAR_LITERAL7838 / CHAR_LITERAL
7840 / ContainerDecl7839 / ContainerDecl
7841 / ErrorSetDecl7840 / ErrorSetDecl
...@@ -7858,91 +7857,91 @@ PrimaryTypeExpr...@@ -7858,91 +7857,91 @@ PrimaryTypeExpr
7858 / STRINGLITERAL7857 / STRINGLITERAL
7859 / SwitchExpr7858 / SwitchExpr
78607859
7861ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto7860ContainerDecl &lt;- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto
78627861
7863ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE7862ErrorSetDecl &lt;- KEYWORD_error LBRACE IdentifierList RBRACE
78647863
7865GroupedExpr <- LPAREN Expr RPAREN7864GroupedExpr &lt;- LPAREN Expr RPAREN
78667865
7867IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?7866IfTypeExpr &lt;- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
78687867
7869LabeledTypeExpr7868LabeledTypeExpr
7870 <- BlockLabel Block7869 &lt;- BlockLabel Block
7871 / BlockLabel? LoopTypeExpr7870 / BlockLabel? LoopTypeExpr
78727871
7873LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr)7872LoopTypeExpr &lt;- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr)
78747873
7875ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?7874ForTypeExpr &lt;- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
78767875
7877WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?7876WhileTypeExpr &lt;- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
78787877
7879SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE7878SwitchExpr &lt;- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
78807879
7881# *** Assembly ***7880# *** Assembly ***
7882AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN STRINGLITERAL AsmOutput? RPAREN7881AsmExpr &lt;- KEYWORD_asm KEYWORD_volatile? LPAREN STRINGLITERAL AsmOutput? RPAREN
78837882
7884AsmOutput <- COLON AsmOutputList AsmInput?7883AsmOutput &lt;- COLON AsmOutputList AsmInput?
78857884
7886AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN7885AsmOutputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
78877886
7888AsmInput <- COLON AsmInputList AsmCloppers?7887AsmInput &lt;- COLON AsmInputList AsmCloppers?
78897888
7890AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN7889AsmInputItem &lt;- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
78917890
7892AsmCloppers <- COLON StringList7891AsmCloppers &lt;- COLON StringList
78937892
7894# *** Helper grammar ***7893# *** Helper grammar ***
7895BreakLabel <- COLON IDENTIFIER7894BreakLabel &lt;- COLON IDENTIFIER
78967895
7897BlockLabel <- IDENTIFIER COLON7896BlockLabel &lt;- IDENTIFIER COLON
78987897
7899FieldInit <- DOT IDENTIFIER EQUAL Expr7898FieldInit &lt;- DOT IDENTIFIER EQUAL Expr
79007899
7901WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN7900WhileContinueExpr &lt;- COLON LPAREN AssignExpr RPAREN
79027901
7903Section <- KEYWORD_section LPAREN Expr RPAREN7902LinkSection &lt;- KEYWORD_linksection LPAREN Expr RPAREN
79047903
7905# Fn specific7904# Fn specific
7906FnCC7905FnCC
7907 <- KEYWORD_nakedcc7906 &lt;- KEYWORD_nakedcc
7908 / KEYWORD_stdcallcc7907 / KEYWORD_stdcallcc
7909 / KEYWORD_extern7908 / KEYWORD_extern
7910 / KEYWORD_async (LARROW TypeExpr RARROW)?7909 / KEYWORD_async (LARROW TypeExpr RARROW)?
79117910
7912ParamDecl <- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType7911ParamDecl &lt;- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
79137912
7914ParamType7913ParamType
7915 <- KEYWORD_var7914 &lt;- KEYWORD_var
7916 / DOT37915 / DOT3
7917 / TypeExpr7916 / TypeExpr
79187917
7919# Control flow prefixes7918# Control flow prefixes
7920IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload?7919IfPrefix &lt;- KEYWORD_if LPAREN Expr RPAREN PtrPayload?
79217920
7922WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?7921WhilePrefix &lt;- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
79237922
7924ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload7923ForPrefix &lt;- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
79257924
7926# Payloads7925# Payloads
7927Payload <- PIPE IDENTIFIER PIPE7926Payload &lt;- PIPE IDENTIFIER PIPE
79287927
7929PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE7928PtrPayload &lt;- PIPE ASTERISK? IDENTIFIER PIPE
79307929
7931PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE7930PtrIndexPayload &lt;- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
79327931
79337932
7934# Switch specific7933# Switch specific
7935SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr7934SwitchProng &lt;- SwitchCase EQUALRARROW PtrPayload? AssignExpr
79367935
7937SwitchCase7936SwitchCase
7938 <- SwitchItem (COMMA SwitchItem)* COMMA?7937 &lt;- SwitchItem (COMMA SwitchItem)* COMMA?
7939 / KEYWORD_else7938 / KEYWORD_else
79407939
7941SwitchItem <- Expr (DOT3 Expr)?7940SwitchItem &lt;- Expr (DOT3 Expr)?
79427941
7943# Operators7942# Operators
7944AssignOp7943AssignOp
7945 <- ASTERISKEQUAL7944 &lt;- ASTERISKEQUAL
7946 / SLASHEQUAL7945 / SLASHEQUAL
7947 / PERCENTEQUAL7946 / PERCENTEQUAL
7948 / PLUSEQUAL7947 / PLUSEQUAL
...@@ -7958,7 +7957,7 @@ AssignOp...@@ -7958,7 +7957,7 @@ AssignOp
7958 / EQUAL7957 / EQUAL
79597958
7960CompareOp7959CompareOp
7961 <- EQUALEQUAL7960 &lt;- EQUALEQUAL
7962 / EXCLAMATIONMARKEQUAL7961 / EXCLAMATIONMARKEQUAL
7963 / LARROW7962 / LARROW
7964 / RARROW7963 / RARROW
...@@ -7966,25 +7965,25 @@ CompareOp...@@ -7966,25 +7965,25 @@ CompareOp
7966 / RARROWEQUAL7965 / RARROWEQUAL
79677966
7968BitwiseOp7967BitwiseOp
7969 <- AMPERSAND7968 &lt;- AMPERSAND
7970 / CARET7969 / CARET
7971 / PIPE7970 / PIPE
7972 / KEYWORD_orelse7971 / KEYWORD_orelse
7973 / KEYWORD_catch Payload?7972 / KEYWORD_catch Payload?
79747973
7975BitShiftOp7974BitShiftOp
7976 <- LARROW27975 &lt;- LARROW2
7977 / RARROW27976 / RARROW2
79787977
7979AdditionOp7978AdditionOp
7980 <- PLUS7979 &lt;- PLUS
7981 / MINUS7980 / MINUS
7982 / PLUS27981 / PLUS2
7983 / PLUSPERCENT7982 / PLUSPERCENT
7984 / MINUSPERCENT7983 / MINUSPERCENT
79857984
7986MultiplyOp7985MultiplyOp
7987 <- PIPE27986 &lt;- PIPE2
7988 / ASTERISK7987 / ASTERISK
7989 / SLASH7988 / SLASH
7990 / PERCENT7989 / PERCENT
...@@ -7992,7 +7991,7 @@ MultiplyOp...@@ -7992,7 +7991,7 @@ MultiplyOp
7992 / ASTERISKPERCENT7991 / ASTERISKPERCENT
79937992
7994PrefixOp7993PrefixOp
7995 <- EXCLAMATIONMARK7994 &lt;- EXCLAMATIONMARK
7996 / MINUS7995 / MINUS
7997 / TILDE7996 / TILDE
7998 / MINUSPERCENT7997 / MINUSPERCENT
...@@ -8001,77 +8000,77 @@ PrefixOp...@@ -8001,77 +8000,77 @@ PrefixOp
8001 / KEYWORD_await8000 / KEYWORD_await
80028001
8003PrefixTypeOp8002PrefixTypeOp
8004 <- QUESTIONMARK8003 &lt;- QUESTIONMARK
8005 / KEYWORD_promise MINUSRARROW8004 / KEYWORD_promise MINUSRARROW
8006 / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile)*8005 / ArrayTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile)*
8007 / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile)*8006 / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile)*
80088007
8009SuffixOp8008SuffixOp
8010 <- LBRACKET Expr (DOT2 Expr?)? RBRACKET8009 &lt;- LBRACKET Expr (DOT2 Expr?)? RBRACKET
8011 / DOT IDENTIFIER8010 / DOT IDENTIFIER
8012 / DOTASTERISK8011 / DOTASTERISK
8013 / DOTQUESTIONMARK8012 / DOTQUESTIONMARK
80148013
8015AsyncPrefix <- KEYWORD_async (LARROW PrefixExpr RARROW)?8014AsyncPrefix &lt;- KEYWORD_async (LARROW PrefixExpr RARROW)?
80168015
8017FnCallArgumnets <- LPAREN ExprList RPAREN8016FnCallArgumnets &lt;- LPAREN ExprList RPAREN
80188017
8019# Ptr specific8018# Ptr specific
8020ArrayTypeStart <- LBRACKET Expr? RBRACKET8019ArrayTypeStart &lt;- LBRACKET Expr? RBRACKET
80218020
8022PtrTypeStart8021PtrTypeStart
8023 <- ASTERISK8022 &lt;- ASTERISK
8024 / ASTERISK28023 / ASTERISK2
8025 / LBRACKET ASTERISK RBRACKET8024 / LBRACKET ASTERISK RBRACKET
80268025
8027# ContainerDecl specific8026# ContainerDecl specific
8028ContainerDeclAuto <- ContainerDeclType LBRACE ContainerMembers RBRACE8027ContainerDeclAuto &lt;- ContainerDeclType LBRACE ContainerMembers RBRACE
80298028
8030ContainerDeclType8029ContainerDeclType
8031 <- (KEYWORD_struct / KEYWORD_enum) (LPAREN Expr RPAREN)?8030 &lt;- (KEYWORD_struct / KEYWORD_enum) (LPAREN Expr RPAREN)?
8032 / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?8031 / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?
80338032
8034# Alignment8033# Alignment
8035ByteAlign <- KEYWORD_align LPAREN Expr RPAREN8034ByteAlign &lt;- KEYWORD_align LPAREN Expr RPAREN
80368035
8037# Lists8036# Lists
8038IdentifierList <- (IDENTIFIER COMMA)* IDENTIFIER?8037IdentifierList &lt;- (IDENTIFIER COMMA)* IDENTIFIER?
80398038
8040SwitchProngList <- (SwitchProng COMMA)* SwitchProng?8039SwitchProngList &lt;- (SwitchProng COMMA)* SwitchProng?
80418040
8042AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem?8041AsmOutputList &lt;- (AsmOutputItem COMMA)* AsmOutputItem?
80438042
8044AsmInputList <- (AsmInputItem COMMA)* AsmInputItem?8043AsmInputList &lt;- (AsmInputItem COMMA)* AsmInputItem?
80458044
8046StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?8045StringList &lt;- (STRINGLITERAL COMMA)* STRINGLITERAL?
80478046
8048ParamDeclList <- (ParamDecl COMMA)* ParamDecl?8047ParamDeclList &lt;- (ParamDecl COMMA)* ParamDecl?
80498048
8050ExprList <- (Expr COMMA)* Expr?8049ExprList &lt;- (Expr COMMA)* Expr?
80518050
8052# *** Tokens ***8051# *** Tokens ***
8053eof <- !.8052eof &lt;- !.
8054hex <- [0-9a-fA-F]8053hex &lt;- [0-9a-fA-F]
8055char_escape8054char_escape
8056 <- "\\x" hex hex8055 &lt;- "\\x" hex hex
8057 / "\\u" hex hex hex hex8056 / "\\u" hex hex hex hex
8058 / "\\U" hex hex hex hex hex hex8057 / "\\U" hex hex hex hex hex hex
8059 / "\\" [nr\\t'"]8058 / "\\" [nr\\t'"]
8060char_char8059char_char
8061 <- char_escape8060 &lt;- char_escape
8062 / [^\\'\n]8061 / [^\\'\n]
8063string_char8062string_char
8064 <- char_escape8063 &lt;- char_escape
8065 / [^\\"\n]8064 / [^\\"\n]
80668065
8067line_comment <- '//'[^\n]*8066line_comment &lt;- '//'[^\n]*
8068line_string <- ("\\\\" [^\n]* [ \n]*)+8067line_string &lt;- ("\\\\" [^\n]* [ \n]*)+
8069line_cstring <- ("c\\\\" [^\n]* [ \n]*)+8068line_cstring &lt;- ("c\\\\" [^\n]* [ \n]*)+
8070skip <- ([ \n] / line_comment)*8069skip &lt;- ([ \n] / line_comment)*
80718070
8072CHAR_LITERAL <- "'" char_char "'" skip8071CHAR_LITERAL &lt;- "'" char_char "'" skip
8073FLOAT8072FLOAT
8074 <- "0b" [01]+ "." [01]+ ([eE] [-+]? [01]+)? skip8073 &lt;- "0b" [01]+ "." [01]+ ([eE] [-+]? [01]+)? skip
8075 / "0o" [0-7]+ "." [0-7]+ ([eE] [-+]? [0-7]+)? skip8074 / "0o" [0-7]+ "." [0-7]+ ([eE] [-+]? [0-7]+)? skip
8076 / "0x" hex+ "." hex+ ([pP] [-+]? hex+)? skip8075 / "0x" hex+ "." hex+ ([pP] [-+]? hex+)? skip
8077 / [0-9]+ "." [0-9]+ ([eE] [-+]? [0-9]+)? skip8076 / [0-9]+ "." [0-9]+ ([eE] [-+]? [0-9]+)? skip
...@@ -8080,128 +8079,128 @@ FLOAT...@@ -8080,128 +8079,128 @@ FLOAT
8080 / "0x" hex+ "."? [pP] [-+]? hex+ skip8079 / "0x" hex+ "."? [pP] [-+]? hex+ skip
8081 / [0-9]+ "."? [eE] [-+]? [0-9]+ skip8080 / [0-9]+ "."? [eE] [-+]? [0-9]+ skip
8082INTEGER8081INTEGER
8083 <- "0b" [01]+ skip8082 &lt;- "0b" [01]+ skip
8084 / "0o" [0-7]+ skip8083 / "0o" [0-7]+ skip
8085 / "0x" hex+ skip8084 / "0x" hex+ skip
8086 / [0-9]+ skip8085 / [0-9]+ skip
8087STRINGLITERAL8086STRINGLITERAL
8088 <- "c"? "\"" string_char* "\"" skip8087 &lt;- "c"? "\"" string_char* "\"" skip
8089 / line_string skip8088 / line_string skip
8090 / line_cstring skip8089 / line_cstring skip
8091IDENTIFIER8090IDENTIFIER
8092 <- !keyword ("c" !["\\] / [A-Zabd-z_]) [A-Za-z0-9_]* skip8091 &lt;- !keyword ("c" !["\\] / [A-Zabd-z_]) [A-Za-z0-9_]* skip
8093 / "@\"" string_char* "\"" skip8092 / "@\"" string_char* "\"" skip
8094BUILTININDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip8093BUILTININDENTIFIER &lt;- "@"[A-Za-z_][A-Za-z0-9_]* skip
80958094
80968095
8097AMPERSAND <- '&' ![=] skip8096AMPERSAND &lt;- '&' ![=] skip
8098AMPERSANDEQUAL <- '&=' skip8097AMPERSANDEQUAL &lt;- '&=' skip
8099ASTERISK <- '*' ![*%=] skip8098ASTERISK &lt;- '*' ![*%=] skip
8100ASTERISK2 <- '**' skip8099ASTERISK2 &lt;- '**' skip
8101ASTERISKEQUAL <- '*=' skip8100ASTERISKEQUAL &lt;- '*=' skip
8102ASTERISKPERCENT <- '*%' ![=] skip8101ASTERISKPERCENT &lt;- '*%' ![=] skip
8103ASTERISKPERCENTEQUAL <- '*%=' skip8102ASTERISKPERCENTEQUAL &lt;- '*%=' skip
8104CARET <- '^' ![=] skip8103CARET &lt;- '^' ![=] skip
8105CARETEQUAL <- '^=' skip8104CARETEQUAL &lt;- '^=' skip
8106COLON <- ':' skip8105COLON &lt;- ':' skip
8107COMMA <- ',' skip8106COMMA &lt;- ',' skip
8108DOT <- '.' ![*.?] skip8107DOT &lt;- '.' ![*.?] skip
8109DOT2 <- '..' ![.] skip8108DOT2 &lt;- '..' ![.] skip
8110DOT3 <- '...' skip8109DOT3 &lt;- '...' skip
8111DOTASTERISK <- '.*' skip8110DOTASTERISK &lt;- '.*' skip
8112DOTQUESTIONMARK <- '.?' skip8111DOTQUESTIONMARK &lt;- '.?' skip
8113EQUAL <- '=' ![>=] skip8112EQUAL &lt;- '=' ![>=] skip
8114EQUALEQUAL <- '==' skip8113EQUALEQUAL &lt;- '==' skip
8115EQUALRARROW <- '=>' skip8114EQUALRARROW &lt;- '=>' skip
8116EXCLAMATIONMARK <- '!' ![=] skip8115EXCLAMATIONMARK &lt;- '!' ![=] skip
8117EXCLAMATIONMARKEQUAL <- '!=' skip8116EXCLAMATIONMARKEQUAL &lt;- '!=' skip
8118LARROW <- '<' ![<=] skip8117LARROW &lt;- '&lt;' ![&lt;=] skip
8119LARROW2 <- '<<' ![=] skip8118LARROW2 &lt;- '&lt;&lt;' ![=] skip
8120LARROW2EQUAL <- '<<=' skip8119LARROW2EQUAL &lt;- '&lt;&lt;=' skip
8121LARROWEQUAL <- '<=' skip8120LARROWEQUAL &lt;- '&lt;=' skip
8122LBRACE <- '{' skip8121LBRACE &lt;- '{' skip
8123LBRACKET <- '[' skip8122LBRACKET &lt;- '[' skip
8124LPAREN <- '(' skip8123LPAREN &lt;- '(' skip
8125MINUS <- '-' ![%=>] skip8124MINUS &lt;- '-' ![%=>] skip
8126MINUSEQUAL <- '-=' skip8125MINUSEQUAL &lt;- '-=' skip
8127MINUSPERCENT <- '-%' ![=] skip8126MINUSPERCENT &lt;- '-%' ![=] skip
8128MINUSPERCENTEQUAL <- '-%=' skip8127MINUSPERCENTEQUAL &lt;- '-%=' skip
8129MINUSRARROW <- '->' skip8128MINUSRARROW &lt;- '->' skip
8130PERCENT <- '%' ![=] skip8129PERCENT &lt;- '%' ![=] skip
8131PERCENTEQUAL <- '%=' skip8130PERCENTEQUAL &lt;- '%=' skip
8132PIPE <- '|' ![|=] skip8131PIPE &lt;- '|' ![|=] skip
8133PIPE2 <- '||' skip8132PIPE2 &lt;- '||' skip
8134PIPEEQUAL <- '|=' skip8133PIPEEQUAL &lt;- '|=' skip
8135PLUS <- '+' ![%+=] skip8134PLUS &lt;- '+' ![%+=] skip
8136PLUS2 <- '++' skip8135PLUS2 &lt;- '++' skip
8137PLUSEQUAL <- '+=' skip8136PLUSEQUAL &lt;- '+=' skip
8138PLUSPERCENT <- '+%' ![=] skip8137PLUSPERCENT &lt;- '+%' ![=] skip
8139PLUSPERCENTEQUAL <- '+%=' skip8138PLUSPERCENTEQUAL &lt;- '+%=' skip
8140QUESTIONMARK <- '?' skip8139QUESTIONMARK &lt;- '?' skip
8141RARROW <- '>' ![>=] skip8140RARROW &lt;- '>' ![>=] skip
8142RARROW2 <- '>>' ![=] skip8141RARROW2 &lt;- '>>' ![=] skip
8143RARROW2EQUAL <- '>>=' skip8142RARROW2EQUAL &lt;- '>>=' skip
8144RARROWEQUAL <- '>=' skip8143RARROWEQUAL &lt;- '>=' skip
8145RBRACE <- '}' skip8144RBRACE &lt;- '}' skip
8146RBRACKET <- ']' skip8145RBRACKET &lt;- ']' skip
8147RPAREN <- ')' skip8146RPAREN &lt;- ')' skip
8148SEMICOLON <- ';' skip8147SEMICOLON &lt;- ';' skip
8149SLASH <- '/' ![=] skip8148SLASH &lt;- '/' ![=] skip
8150SLASHEQUAL <- '/=' skip8149SLASHEQUAL &lt;- '/=' skip
8151TILDE <- '~' skip8150TILDE &lt;- '~' skip
81528151
8153end_of_word <- ![a-zA-Z0-9_] skip8152end_of_word &lt;- ![a-zA-Z0-9_] skip
8154KEYWORD_align <- 'align' end_of_word8153KEYWORD_align &lt;- 'align' end_of_word
8155KEYWORD_and <- 'and' end_of_word8154KEYWORD_and &lt;- 'and' end_of_word
8156KEYWORD_anyerror <- 'anyerror' end_of_word8155KEYWORD_anyerror &lt;- 'anyerror' end_of_word
8157KEYWORD_asm <- 'asm' end_of_word8156KEYWORD_asm &lt;- 'asm' end_of_word
8158KEYWORD_async <- 'async' end_of_word8157KEYWORD_async &lt;- 'async' end_of_word
8159KEYWORD_await <- 'await' end_of_word8158KEYWORD_await &lt;- 'await' end_of_word
8160KEYWORD_break <- 'break' end_of_word8159KEYWORD_break &lt;- 'break' end_of_word
8161KEYWORD_cancel <- 'cancel' end_of_word8160KEYWORD_cancel &lt;- 'cancel' end_of_word
8162KEYWORD_catch <- 'catch' end_of_word8161KEYWORD_catch &lt;- 'catch' end_of_word
8163KEYWORD_comptime <- 'comptime' end_of_word8162KEYWORD_comptime &lt;- 'comptime' end_of_word
8164KEYWORD_const <- 'const' end_of_word8163KEYWORD_const &lt;- 'const' end_of_word
8165KEYWORD_continue <- 'continue' end_of_word8164KEYWORD_continue &lt;- 'continue' end_of_word
8166KEYWORD_defer <- 'defer' end_of_word8165KEYWORD_defer &lt;- 'defer' end_of_word
8167KEYWORD_else <- 'else' end_of_word8166KEYWORD_else &lt;- 'else' end_of_word
8168KEYWORD_enum <- 'enum' end_of_word8167KEYWORD_enum &lt;- 'enum' end_of_word
8169KEYWORD_errdefer <- 'errdefer' end_of_word8168KEYWORD_errdefer &lt;- 'errdefer' end_of_word
8170KEYWORD_error <- 'error' end_of_word8169KEYWORD_error &lt;- 'error' end_of_word
8171KEYWORD_export <- 'export' end_of_word8170KEYWORD_export &lt;- 'export' end_of_word
8172KEYWORD_extern <- 'extern' end_of_word8171KEYWORD_extern &lt;- 'extern' end_of_word
8173KEYWORD_false <- 'false' end_of_word8172KEYWORD_false &lt;- 'false' end_of_word
8174KEYWORD_fn <- 'fn' end_of_word8173KEYWORD_fn &lt;- 'fn' end_of_word
8175KEYWORD_for <- 'for' end_of_word8174KEYWORD_for &lt;- 'for' end_of_word
8176KEYWORD_if <- 'if' end_of_word8175KEYWORD_if &lt;- 'if' end_of_word
8177KEYWORD_inline <- 'inline' end_of_word8176KEYWORD_inline &lt;- 'inline' end_of_word
8178KEYWORD_nakedcc <- 'nakedcc' end_of_word8177KEYWORD_nakedcc &lt;- 'nakedcc' end_of_word
8179KEYWORD_noalias <- 'noalias' end_of_word8178KEYWORD_noalias &lt;- 'noalias' end_of_word
8180KEYWORD_null <- 'null' end_of_word8179KEYWORD_null &lt;- 'null' end_of_word
8181KEYWORD_or <- 'or' end_of_word8180KEYWORD_or &lt;- 'or' end_of_word
8182KEYWORD_orelse <- 'orelse' end_of_word8181KEYWORD_orelse &lt;- 'orelse' end_of_word
8183KEYWORD_packed <- 'packed' end_of_word8182KEYWORD_packed &lt;- 'packed' end_of_word
8184KEYWORD_promise <- 'promise' end_of_word8183KEYWORD_promise &lt;- 'promise' end_of_word
8185KEYWORD_pub <- 'pub' end_of_word8184KEYWORD_pub &lt;- 'pub' end_of_word
8186KEYWORD_resume <- 'resume' end_of_word8185KEYWORD_resume &lt;- 'resume' end_of_word
8187KEYWORD_return <- 'return' end_of_word8186KEYWORD_return &lt;- 'return' end_of_word
8188KEYWORD_section <- 'section' end_of_word8187KEYWORD_linksection &lt;- 'linksection' end_of_word
8189KEYWORD_stdcallcc <- 'stdcallcc' end_of_word8188KEYWORD_stdcallcc &lt;- 'stdcallcc' end_of_word
8190KEYWORD_struct <- 'struct' end_of_word8189KEYWORD_struct &lt;- 'struct' end_of_word
8191KEYWORD_suspend <- 'suspend' end_of_word8190KEYWORD_suspend &lt;- 'suspend' end_of_word
8192KEYWORD_switch <- 'switch' end_of_word8191KEYWORD_switch &lt;- 'switch' end_of_word
8193KEYWORD_test <- 'test' end_of_word8192KEYWORD_test &lt;- 'test' end_of_word
8194KEYWORD_true <- 'true' end_of_word8193KEYWORD_true &lt;- 'true' end_of_word
8195KEYWORD_try <- 'try' end_of_word8194KEYWORD_try &lt;- 'try' end_of_word
8196KEYWORD_undefined <- 'undefined' end_of_word8195KEYWORD_undefined &lt;- 'undefined' end_of_word
8197KEYWORD_union <- 'union' end_of_word8196KEYWORD_union &lt;- 'union' end_of_word
8198KEYWORD_unreachable <- 'unreachable' end_of_word8197KEYWORD_unreachable &lt;- 'unreachable' end_of_word
8199KEYWORD_use <- 'use' end_of_word8198KEYWORD_use &lt;- 'use' end_of_word
8200KEYWORD_var <- 'var' end_of_word8199KEYWORD_var &lt;- 'var' end_of_word
8201KEYWORD_volatile <- 'volatile' end_of_word8200KEYWORD_volatile &lt;- 'volatile' end_of_word
8202KEYWORD_while <- 'while' end_of_word8201KEYWORD_while &lt;- 'while' end_of_word
82038202
8204keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm8203keyword &lt;- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm
8205 / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_cancel8204 / KEYWORD_async / KEYWORD_await / KEYWORD_break / KEYWORD_cancel
8206 / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue8205 / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue
8207 / KEYWORD_defer / KEYWORD_else / KEYWORD_enum / KEYWORD_errdefer8206 / KEYWORD_defer / KEYWORD_else / KEYWORD_enum / KEYWORD_errdefer
...@@ -8209,12 +8208,11 @@ keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm...@@ -8209,12 +8208,11 @@ keyword <- KEYWORD_align / KEYWORD_and / KEYWORD_anyerror / KEYWORD_asm
8209 / KEYWORD_fn / KEYWORD_for / KEYWORD_if / KEYWORD_inline8208 / KEYWORD_fn / KEYWORD_for / KEYWORD_if / KEYWORD_inline
8210 / KEYWORD_nakedcc / KEYWORD_noalias / KEYWORD_null / KEYWORD_or8209 / KEYWORD_nakedcc / KEYWORD_noalias / KEYWORD_null / KEYWORD_or
8211 / KEYWORD_orelse / KEYWORD_packed / KEYWORD_promise / KEYWORD_pub8210 / KEYWORD_orelse / KEYWORD_packed / KEYWORD_promise / KEYWORD_pub
8212 / KEYWORD_resume / KEYWORD_return / KEYWORD_section8211 / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection
8213 / KEYWORD_stdcallcc / KEYWORD_struct / KEYWORD_suspend8212 / KEYWORD_stdcallcc / KEYWORD_struct / KEYWORD_suspend
8214 / KEYWORD_switch / KEYWORD_test / KEYWORD_true / KEYWORD_try8213 / KEYWORD_switch / KEYWORD_test / KEYWORD_true / KEYWORD_try
8215 / KEYWORD_undefined / KEYWORD_union / KEYWORD_unreachable8214 / KEYWORD_undefined / KEYWORD_union / KEYWORD_unreachable
8216 / KEYWORD_use / KEYWORD_var / KEYWORD_volatile / KEYWORD_while8215 / KEYWORD_use / KEYWORD_var / KEYWORD_volatile / KEYWORD_while</code></pre>
8217</code></pre>
8218 {#header_close#}8216 {#header_close#}
8219 {#header_open|Zen#}8217 {#header_open|Zen#}
8220 <ul>8218 <ul>
src/parser.cpp+1-1
...@@ -2082,7 +2082,7 @@ static AstNode *ast_parse_while_continue_expr(ParseContext *pc) {...@@ -2082,7 +2082,7 @@ static AstNode *ast_parse_while_continue_expr(ParseContext *pc) {
20822082
2083// Section <- KEYWORD_section LPAREN Expr RPAREN2083// Section <- KEYWORD_section LPAREN Expr RPAREN
2084static AstNode *ast_parse_section(ParseContext *pc) {2084static AstNode *ast_parse_section(ParseContext *pc) {
2085 Token *first = eat_token_if(pc, TokenIdKeywordSection);2085 Token *first = eat_token_if(pc, TokenIdKeywordLinkSection);
2086 if (first == nullptr)2086 if (first == nullptr)
2087 return nullptr;2087 return nullptr;
20882088
src/tokenizer.cpp+2-2
...@@ -140,7 +140,7 @@ static const struct ZigKeyword zig_keywords[] = {...@@ -140,7 +140,7 @@ static const struct ZigKeyword zig_keywords[] = {
140 {"pub", TokenIdKeywordPub},140 {"pub", TokenIdKeywordPub},
141 {"resume", TokenIdKeywordResume},141 {"resume", TokenIdKeywordResume},
142 {"return", TokenIdKeywordReturn},142 {"return", TokenIdKeywordReturn},
143 {"section", TokenIdKeywordSection},143 {"linksection", TokenIdKeywordLinkSection},
144 {"stdcallcc", TokenIdKeywordStdcallCC},144 {"stdcallcc", TokenIdKeywordStdcallCC},
145 {"struct", TokenIdKeywordStruct},145 {"struct", TokenIdKeywordStruct},
146 {"suspend", TokenIdKeywordSuspend},146 {"suspend", TokenIdKeywordSuspend},
...@@ -1583,7 +1583,7 @@ const char * token_name(TokenId id) {...@@ -1583,7 +1583,7 @@ const char * token_name(TokenId id) {
1583 case TokenIdKeywordPromise: return "promise";1583 case TokenIdKeywordPromise: return "promise";
1584 case TokenIdKeywordPub: return "pub";1584 case TokenIdKeywordPub: return "pub";
1585 case TokenIdKeywordReturn: return "return";1585 case TokenIdKeywordReturn: return "return";
1586 case TokenIdKeywordSection: return "section";1586 case TokenIdKeywordLinkSection: return "linksection";
1587 case TokenIdKeywordStdcallCC: return "stdcallcc";1587 case TokenIdKeywordStdcallCC: return "stdcallcc";
1588 case TokenIdKeywordStruct: return "struct";1588 case TokenIdKeywordStruct: return "struct";
1589 case TokenIdKeywordSwitch: return "switch";1589 case TokenIdKeywordSwitch: return "switch";
src/tokenizer.hpp+1-1
...@@ -82,7 +82,7 @@ enum TokenId {...@@ -82,7 +82,7 @@ enum TokenId {
82 TokenIdKeywordPub,82 TokenIdKeywordPub,
83 TokenIdKeywordResume,83 TokenIdKeywordResume,
84 TokenIdKeywordReturn,84 TokenIdKeywordReturn,
85 TokenIdKeywordSection,85 TokenIdKeywordLinkSection,
86 TokenIdKeywordStdcallCC,86 TokenIdKeywordStdcallCC,
87 TokenIdKeywordStruct,87 TokenIdKeywordStruct,
88 TokenIdKeywordSuspend,88 TokenIdKeywordSuspend,
std/zig/ast.zig+12
...@@ -503,6 +503,7 @@ pub const Node = struct {...@@ -503,6 +503,7 @@ pub const Node = struct {
503 lib_name: ?*Node,503 lib_name: ?*Node,
504 type_node: ?*Node,504 type_node: ?*Node,
505 align_node: ?*Node,505 align_node: ?*Node,
506 section_node: ?*Node,
506 init_node: ?*Node,507 init_node: ?*Node,
507 semicolon_token: TokenIndex,508 semicolon_token: TokenIndex,
508509
...@@ -519,6 +520,11 @@ pub const Node = struct {...@@ -519,6 +520,11 @@ pub const Node = struct {
519 i -= 1;520 i -= 1;
520 }521 }
521522
523 if (self.section_node) |section_node| {
524 if (i < 1) return section_node;
525 i -= 1;
526 }
527
522 if (self.init_node) |init_node| {528 if (self.init_node) |init_node| {
523 if (i < 1) return init_node;529 if (i < 1) return init_node;
524 i -= 1;530 i -= 1;
...@@ -821,6 +827,7 @@ pub const Node = struct {...@@ -821,6 +827,7 @@ pub const Node = struct {
821 body_node: ?*Node,827 body_node: ?*Node,
822 lib_name: ?*Node, // populated if this is an extern declaration828 lib_name: ?*Node, // populated if this is an extern declaration
823 align_expr: ?*Node, // populated if align(A) is present829 align_expr: ?*Node, // populated if align(A) is present
830 section_expr: ?*Node, // populated if linksection(A) is present
824831
825 pub const ParamList = SegmentedList(*Node, 2);832 pub const ParamList = SegmentedList(*Node, 2);
826833
...@@ -845,6 +852,11 @@ pub const Node = struct {...@@ -845,6 +852,11 @@ pub const Node = struct {
845 i -= 1;852 i -= 1;
846 }853 }
847854
855 if (self.section_expr) |section_expr| {
856 if (i < 1) return section_expr;
857 i -= 1;
858 }
859
848 switch (self.return_type) {860 switch (self.return_type) {
849 // TODO allow this and next prong to share bodies since the types are the same861 // TODO allow this and next prong to share bodies since the types are the same
850 ReturnType.Explicit => |node| {862 ReturnType.Explicit => |node| {
std/zig/parse.zig+35-2
...@@ -291,6 +291,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -291,6 +291,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
291 .body_node = null,291 .body_node = null,
292 .lib_name = ctx.lib_name,292 .lib_name = ctx.lib_name,
293 .align_expr = null,293 .align_expr = null,
294 .section_expr = null,
294 });295 });
295 try ctx.decls.push(&fn_proto.base);296 try ctx.decls.push(&fn_proto.base);
296 stack.append(State{ .FnDef = fn_proto }) catch unreachable;297 stack.append(State{ .FnDef = fn_proto }) catch unreachable;
...@@ -601,6 +602,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -601,6 +602,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
601 .extern_export_token = ctx.extern_export_token,602 .extern_export_token = ctx.extern_export_token,
602 .type_node = null,603 .type_node = null,
603 .align_node = null,604 .align_node = null,
605 .section_node = null,
604 .init_node = null,606 .init_node = null,
605 .lib_name = ctx.lib_name,607 .lib_name = ctx.lib_name,
606 // initialized later608 // initialized later
...@@ -622,7 +624,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -622,7 +624,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
622 continue;624 continue;
623 },625 },
624 State.VarDeclAlign => |var_decl| {626 State.VarDeclAlign => |var_decl| {
625 try stack.append(State{ .VarDeclEq = var_decl });627 try stack.append(State{ .VarDeclSection = var_decl });
626628
627 const next_token = nextToken(&tok_it, &tree);629 const next_token = nextToken(&tok_it, &tree);
628 const next_token_index = next_token.index;630 const next_token_index = next_token.index;
...@@ -637,6 +639,22 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -637,6 +639,22 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
637 prevToken(&tok_it, &tree);639 prevToken(&tok_it, &tree);
638 continue;640 continue;
639 },641 },
642 State.VarDeclSection => |var_decl| {
643 try stack.append(State{ .VarDeclEq = var_decl });
644
645 const next_token = nextToken(&tok_it, &tree);
646 const next_token_index = next_token.index;
647 const next_token_ptr = next_token.ptr;
648 if (next_token_ptr.id == Token.Id.Keyword_linksection) {
649 try stack.append(State{ .ExpectToken = Token.Id.RParen });
650 try stack.append(State{ .Expression = OptionalCtx{ .RequiredNull = &var_decl.section_node } });
651 try stack.append(State{ .ExpectToken = Token.Id.LParen });
652 continue;
653 }
654
655 prevToken(&tok_it, &tree);
656 continue;
657 },
640 State.VarDeclEq => |var_decl| {658 State.VarDeclEq => |var_decl| {
641 const token = nextToken(&tok_it, &tree);659 const token = nextToken(&tok_it, &tree);
642 const token_index = token.index;660 const token_index = token.index;
...@@ -719,7 +737,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -719,7 +737,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
719 continue;737 continue;
720 },738 },
721 State.FnProtoAlign => |fn_proto| {739 State.FnProtoAlign => |fn_proto| {
722 stack.append(State{ .FnProtoReturnType = fn_proto }) catch unreachable;740 stack.append(State{ .FnProtoSection = fn_proto }) catch unreachable;
723741
724 if (eatToken(&tok_it, &tree, Token.Id.Keyword_align)) |align_token| {742 if (eatToken(&tok_it, &tree, Token.Id.Keyword_align)) |align_token| {
725 try stack.append(State{ .ExpectToken = Token.Id.RParen });743 try stack.append(State{ .ExpectToken = Token.Id.RParen });
...@@ -728,6 +746,16 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -728,6 +746,16 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
728 }746 }
729 continue;747 continue;
730 },748 },
749 State.FnProtoSection => |fn_proto| {
750 stack.append(State{ .FnProtoReturnType = fn_proto }) catch unreachable;
751
752 if (eatToken(&tok_it, &tree, Token.Id.Keyword_linksection)) |align_token| {
753 try stack.append(State{ .ExpectToken = Token.Id.RParen });
754 try stack.append(State{ .Expression = OptionalCtx{ .RequiredNull = &fn_proto.section_expr } });
755 try stack.append(State{ .ExpectToken = Token.Id.LParen });
756 }
757 continue;
758 },
731 State.FnProtoReturnType => |fn_proto| {759 State.FnProtoReturnType => |fn_proto| {
732 const token = nextToken(&tok_it, &tree);760 const token = nextToken(&tok_it, &tree);
733 const token_index = token.index;761 const token_index = token.index;
...@@ -1524,6 +1552,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -1524,6 +1552,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
1524 .body_node = null,1552 .body_node = null,
1525 .lib_name = null,1553 .lib_name = null,
1526 .align_expr = null,1554 .align_expr = null,
1555 .section_expr = null,
1527 });1556 });
1528 ctx.opt_ctx.store(&fn_proto.base);1557 ctx.opt_ctx.store(&fn_proto.base);
1529 stack.append(State{ .FnProto = fn_proto }) catch unreachable;1558 stack.append(State{ .FnProto = fn_proto }) catch unreachable;
...@@ -2579,6 +2608,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -2579,6 +2608,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
2579 .body_node = null,2608 .body_node = null,
2580 .lib_name = null,2609 .lib_name = null,
2581 .align_expr = null,2610 .align_expr = null,
2611 .section_expr = null,
2582 });2612 });
2583 opt_ctx.store(&fn_proto.base);2613 opt_ctx.store(&fn_proto.base);
2584 stack.append(State{ .FnProto = fn_proto }) catch unreachable;2614 stack.append(State{ .FnProto = fn_proto }) catch unreachable;
...@@ -2600,6 +2630,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {...@@ -2600,6 +2630,7 @@ pub fn parse(allocator: *mem.Allocator, source: []const u8) !ast.Tree {
2600 .body_node = null,2630 .body_node = null,
2601 .lib_name = null,2631 .lib_name = null,
2602 .align_expr = null,2632 .align_expr = null,
2633 .section_expr = null,
2603 });2634 });
2604 opt_ctx.store(&fn_proto.base);2635 opt_ctx.store(&fn_proto.base);
2605 stack.append(State{ .FnProto = fn_proto }) catch unreachable;2636 stack.append(State{ .FnProto = fn_proto }) catch unreachable;
...@@ -2985,12 +3016,14 @@ const State = union(enum) {...@@ -2985,12 +3016,14 @@ const State = union(enum) {
29853016
2986 VarDecl: VarDeclCtx,3017 VarDecl: VarDeclCtx,
2987 VarDeclAlign: *ast.Node.VarDecl,3018 VarDeclAlign: *ast.Node.VarDecl,
3019 VarDeclSection: *ast.Node.VarDecl,
2988 VarDeclEq: *ast.Node.VarDecl,3020 VarDeclEq: *ast.Node.VarDecl,
2989 VarDeclSemiColon: *ast.Node.VarDecl,3021 VarDeclSemiColon: *ast.Node.VarDecl,
29903022
2991 FnDef: *ast.Node.FnProto,3023 FnDef: *ast.Node.FnProto,
2992 FnProto: *ast.Node.FnProto,3024 FnProto: *ast.Node.FnProto,
2993 FnProtoAlign: *ast.Node.FnProto,3025 FnProtoAlign: *ast.Node.FnProto,
3026 FnProtoSection: *ast.Node.FnProto,
2994 FnProtoReturnType: *ast.Node.FnProto,3027 FnProtoReturnType: *ast.Node.FnProto,
29953028
2996 ParamDecl: *ast.Node.FnProto,3029 ParamDecl: *ast.Node.FnProto,
std/zig/parser_test.zig+7
...@@ -1,3 +1,10 @@...@@ -1,3 +1,10 @@
1test "zig fmt: linksection" {
2 try testCanonical(
3 \\export var aoeu: u64 linksection(".text.derp") = 1234;
4 \\export nakedcc fn _start() linksection(".text.boot") noreturn {}
5 \\
6 );
7}
1test "zig fmt: shebang line" {8test "zig fmt: shebang line" {
2 try testCanonical(9 try testCanonical(
3 \\#!/usr/bin/env zig10 \\#!/usr/bin/env zig
std/zig/render.zig+26-2
...@@ -1148,6 +1148,17 @@ fn renderExpression(...@@ -1148,6 +1148,17 @@ fn renderExpression(
1148 try renderToken(tree, stream, align_rparen, indent, start_col, Space.Space); // )1148 try renderToken(tree, stream, align_rparen, indent, start_col, Space.Space); // )
1149 }1149 }
11501150
1151 if (fn_proto.section_expr) |section_expr| {
1152 const section_rparen = tree.nextToken(section_expr.lastToken());
1153 const section_lparen = tree.prevToken(section_expr.firstToken());
1154 const section_kw = tree.prevToken(section_lparen);
1155
1156 try renderToken(tree, stream, section_kw, indent, start_col, Space.None); // section
1157 try renderToken(tree, stream, section_lparen, indent, start_col, Space.None); // (
1158 try renderExpression(allocator, stream, tree, indent, start_col, section_expr, Space.None);
1159 try renderToken(tree, stream, section_rparen, indent, start_col, Space.Space); // )
1160 }
1161
1151 switch (fn_proto.return_type) {1162 switch (fn_proto.return_type) {
1152 ast.Node.FnProto.ReturnType.Explicit => |node| {1163 ast.Node.FnProto.ReturnType.Explicit => |node| {
1153 return renderExpression(allocator, stream, tree, indent, start_col, node, space);1164 return renderExpression(allocator, stream, tree, indent, start_col, node, space);
...@@ -1698,12 +1709,14 @@ fn renderVarDecl(...@@ -1698,12 +1709,14 @@ fn renderVarDecl(
1698 try renderToken(tree, stream, var_decl.mut_token, indent, start_col, Space.Space); // var1709 try renderToken(tree, stream, var_decl.mut_token, indent, start_col, Space.Space); // var
16991710
1700 const name_space = if (var_decl.type_node == null and (var_decl.align_node != null or1711 const name_space = if (var_decl.type_node == null and (var_decl.align_node != null or
1701 var_decl.init_node != null)) Space.Space else Space.None;1712 var_decl.section_node != null or var_decl.init_node != null)) Space.Space else Space.None;
1702 try renderToken(tree, stream, var_decl.name_token, indent, start_col, name_space);1713 try renderToken(tree, stream, var_decl.name_token, indent, start_col, name_space);
17031714
1704 if (var_decl.type_node) |type_node| {1715 if (var_decl.type_node) |type_node| {
1705 try renderToken(tree, stream, tree.nextToken(var_decl.name_token), indent, start_col, Space.Space);1716 try renderToken(tree, stream, tree.nextToken(var_decl.name_token), indent, start_col, Space.Space);
1706 const s = if (var_decl.align_node != null or var_decl.init_node != null) Space.Space else Space.None;1717 const s = if (var_decl.align_node != null or
1718 var_decl.section_node != null or
1719 var_decl.init_node != null) Space.Space else Space.None;
1707 try renderExpression(allocator, stream, tree, indent, start_col, type_node, s);1720 try renderExpression(allocator, stream, tree, indent, start_col, type_node, s);
1708 }1721 }
17091722
...@@ -1714,6 +1727,17 @@ fn renderVarDecl(...@@ -1714,6 +1727,17 @@ fn renderVarDecl(
1714 try renderToken(tree, stream, align_kw, indent, start_col, Space.None); // align1727 try renderToken(tree, stream, align_kw, indent, start_col, Space.None); // align
1715 try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (1728 try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (
1716 try renderExpression(allocator, stream, tree, indent, start_col, align_node, Space.None);1729 try renderExpression(allocator, stream, tree, indent, start_col, align_node, Space.None);
1730 const s = if (var_decl.section_node != null or var_decl.init_node != null) Space.Space else Space.None;
1731 try renderToken(tree, stream, rparen, indent, start_col, s); // )
1732 }
1733
1734 if (var_decl.section_node) |section_node| {
1735 const lparen = tree.prevToken(section_node.firstToken());
1736 const section_kw = tree.prevToken(lparen);
1737 const rparen = tree.nextToken(section_node.lastToken());
1738 try renderToken(tree, stream, section_kw, indent, start_col, Space.None); // linksection
1739 try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (
1740 try renderExpression(allocator, stream, tree, indent, start_col, section_node, Space.None);
1717 const s = if (var_decl.init_node != null) Space.Space else Space.None;1741 const s = if (var_decl.init_node != null) Space.Space else Space.None;
1718 try renderToken(tree, stream, rparen, indent, start_col, s); // )1742 try renderToken(tree, stream, rparen, indent, start_col, s); // )
1719 }1743 }
std/zig/tokenizer.zig+2-2
...@@ -46,7 +46,7 @@ pub const Token = struct {...@@ -46,7 +46,7 @@ pub const Token = struct {
46 Keyword{ .bytes = "pub", .id = Id.Keyword_pub },46 Keyword{ .bytes = "pub", .id = Id.Keyword_pub },
47 Keyword{ .bytes = "resume", .id = Id.Keyword_resume },47 Keyword{ .bytes = "resume", .id = Id.Keyword_resume },
48 Keyword{ .bytes = "return", .id = Id.Keyword_return },48 Keyword{ .bytes = "return", .id = Id.Keyword_return },
49 Keyword{ .bytes = "section", .id = Id.Keyword_section },49 Keyword{ .bytes = "linksection", .id = Id.Keyword_linksection },
50 Keyword{ .bytes = "stdcallcc", .id = Id.Keyword_stdcallcc },50 Keyword{ .bytes = "stdcallcc", .id = Id.Keyword_stdcallcc },
51 Keyword{ .bytes = "struct", .id = Id.Keyword_struct },51 Keyword{ .bytes = "struct", .id = Id.Keyword_struct },
52 Keyword{ .bytes = "suspend", .id = Id.Keyword_suspend },52 Keyword{ .bytes = "suspend", .id = Id.Keyword_suspend },
...@@ -175,7 +175,7 @@ pub const Token = struct {...@@ -175,7 +175,7 @@ pub const Token = struct {
175 Keyword_pub,175 Keyword_pub,
176 Keyword_resume,176 Keyword_resume,
177 Keyword_return,177 Keyword_return,
178 Keyword_section,178 Keyword_linksection,
179 Keyword_stdcallcc,179 Keyword_stdcallcc,
180 Keyword_struct,180 Keyword_struct,
181 Keyword_suspend,181 Keyword_suspend,
test/compile_errors.zig+6-6
...@@ -3867,32 +3867,32 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {...@@ -3867,32 +3867,32 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
38673867
3868 cases.add(3868 cases.add(
3869 "setting a section on an extern variable",3869 "setting a section on an extern variable",
3870 \\extern var foo: i32 section(".text2");3870 \\extern var foo: i32 linksection(".text2");
3871 \\export fn entry() i32 {3871 \\export fn entry() i32 {
3872 \\ return foo;3872 \\ return foo;
3873 \\}3873 \\}
3874 ,3874 ,
3875 ".tmp_source.zig:1:29: error: cannot set section of external variable 'foo'",3875 ".tmp_source.zig:1:33: error: cannot set section of external variable 'foo'",
3876 );3876 );
38773877
3878 cases.add(3878 cases.add(
3879 "setting a section on a local variable",3879 "setting a section on a local variable",
3880 \\export fn entry() i32 {3880 \\export fn entry() i32 {
3881 \\ var foo: i32 section(".text2") = 1234;3881 \\ var foo: i32 linksection(".text2") = 1234;
3882 \\ return foo;3882 \\ return foo;
3883 \\}3883 \\}
3884 ,3884 ,
3885 ".tmp_source.zig:2:26: error: cannot set section of local variable 'foo'",3885 ".tmp_source.zig:2:30: error: cannot set section of local variable 'foo'",
3886 );3886 );
38873887
3888 cases.add(3888 cases.add(
3889 "setting a section on an extern fn",3889 "setting a section on an extern fn",
3890 \\extern fn foo() section(".text2") void;3890 \\extern fn foo() linksection(".text2") void;
3891 \\export fn entry() void {3891 \\export fn entry() void {
3892 \\ foo();3892 \\ foo();
3893 \\}3893 \\}
3894 ,3894 ,
3895 ".tmp_source.zig:1:25: error: cannot set section of external function 'foo'",3895 ".tmp_source.zig:1:29: error: cannot set section of external function 'foo'",
3896 );3896 );
38973897
3898 cases.add(3898 cases.add(