Commit 98d5bfbd4d

Vexu <git@vexu.eu>
2020-11-22 20:15:12
update grammar in langref
1 parent 2fbe951
Changed files (2)
doc
lib
std
doc/langref.html.in
@@ -11042,15 +11042,15 @@ TestDecl &lt;- KEYWORD_test STRINGLITERALSINGLE Block
 TopLevelComptime &lt;- KEYWORD_comptime BlockExpr
 
 TopLevelDecl
-    &lt;- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / KEYWORD_inline)? FnProto (SEMICOLON / Block)
+    &lt;- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block)
      / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl
      / KEYWORD_usingnamespace Expr SEMICOLON
 
-FnProto &lt;- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? EXCLAMATIONMARK? (KEYWORD_anytype / TypeExpr)
+FnProto &lt;- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? (KEYWORD_anytype / TypeExpr)
 
 VarDecl &lt;- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
 
-ContainerField &lt;- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr)? (EQUAL Expr)?
+ContainerField &lt;- KEYWORD_comptime? IDENTIFIER (COLON TypeExpr ByteAlign?)? (EQUAL Expr)?
 
 # *** Block Level ***
 Statement
@@ -11090,7 +11090,7 @@ BlockExpr &lt;- BlockLabel? Block
 # *** Expression Level ***
 AssignExpr &lt;- Expr (AssignOp Expr)?
 
-Expr &lt;- KEYWORD_try* BoolOrExpr
+Expr &lt;- BoolOrExpr
 
 BoolOrExpr &lt;- BoolAndExpr (KEYWORD_or BoolAndExpr)*
 
@@ -11215,6 +11215,8 @@ WhileContinueExpr &lt;- COLON LPAREN AssignExpr RPAREN
 
 LinkSection &lt;- KEYWORD_linksection LPAREN Expr RPAREN
 
+CallConv &lt;- KEYWORD_callconv LPAREN Expr RPAREN
+
 ParamDecl &lt;- (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
 
 ParamType
@@ -11321,19 +11323,20 @@ SuffixOp
 FnCallArguments &lt;- LPAREN ExprList RPAREN
 
 # Ptr specific
-ArrayTypeStart &lt;- LBRACKET Expr? RBRACKET
+ArrayTypeStart &lt;- LBRACKET Expr? (COLON Expr)? RBRACKET
 
 PtrTypeStart
     &lt;- ASTERISK
      / ASTERISK2
-     / PTRUNKNOWN
-     / PTRC
+     / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
 
 # ContainerDecl specific
 ContainerDeclAuto &lt;- ContainerDeclType LBRACE ContainerMembers RBRACE
 
 ContainerDeclType
-    &lt;- (KEYWORD_struct / KEYWORD_enum / KEYWORD_opaque) (LPAREN Expr RPAREN)?
+    &lt;- KEYWORD_struct
+     / KEYWORD_opaque
+     / KEYWORD_enum (LPAREN Expr RPAREN)?
      / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?
 
 # Alignment
@@ -11357,44 +11360,51 @@ ExprList &lt;- (Expr COMMA)* Expr?
 # *** Tokens ***
 eof &lt;- !.
 hex &lt;- [0-9a-fA-F]
+hex_ &lt;- ('_'/hex)
+dec &lt;- [0-9]
+dec_ &lt;- ('_'/dec)
+
+dec_int &lt;- dec (dec_* dec)?
+hex_int &lt;- hex (hex_* dec)?
+
 char_escape
-    &lt;- "\\x" hex hex
-     / "\\u{" hex+ "}"
-     / "\\" [nr\\t'"]
+    &lt;- &quot;\\x&quot; hex hex
+     / &quot;\\u{&quot; hex+ &quot;}&quot;
+     / &quot;\\&quot; [nr\\t'&quot;]
 char_char
     &lt;- char_escape
      / [^\\'\n]
 string_char
     &lt;- char_escape
-     / [^\\"\n]
+     / [^\\&quot;\n]
 
 line_comment &lt;- '//'[^\n]*
-line_string &lt;- ("\\\\" [^\n]* [ \n]*)+
+line_string &lt;- (&quot;\\\\&quot; [^\n]* [ \n]*)+
 skip &lt;- ([ \n] / line_comment)*
 
-CHAR_LITERAL &lt;- "'" char_char "'" skip
+CHAR_LITERAL &lt;- &quot;'&quot; char_char &quot;'&quot; skip
 FLOAT
-    &lt;- "0x" hex+   "." hex+   ([pP] [-+]? hex+)?   skip
-     /      [0-9]+ "." [0-9]+ ([eE] [-+]? [0-9]+)? skip
-     / "0x" hex+   "."? [pP] [-+]? hex+   skip
-     /      [0-9]+ "."? [eE] [-+]? [0-9]+ skip
+    &lt;- &quot;0x&quot; hex_* hex &quot;.&quot; hex_int ([pP] [-+]? hex_int)? skip
+     /      dec_int   &quot;.&quot; dec_int ([eE] [-+]? dec_int)? skip
+     / &quot;0x&quot; hex_* hex &quot;.&quot;? [pP] [-+]? hex_int skip
+     /      dec_int   &quot;.&quot;? [eE] [-+]? dec_int skip
 INTEGER
-    &lt;- "0b" [01]+  skip
-     / "0o" [0-7]+ skip
-     / "0x" hex+   skip
-     /      [0-9]+ skip
-STRINGLITERALSINGLE &lt;- "\"" string_char* "\"" skip
+    &lt;- &quot;0b&quot; [_01]*  [01]  skip
+     / &quot;0o&quot; [_0-7]* [0-7] skip
+     / &quot;0x&quot; hex_* hex skip
+     /      dec_int   skip
+STRINGLITERALSINGLE &lt;- &quot;\&quot;&quot; string_char* &quot;\&quot;&quot; skip
 STRINGLITERAL
     &lt;- STRINGLITERALSINGLE
      / line_string                 skip
 IDENTIFIER
     &lt;- !keyword [A-Za-z_] [A-Za-z0-9_]* skip
-     / "@\"" string_char* "\""                            skip
-BUILTINIDENTIFIER &lt;- "@"[A-Za-z_][A-Za-z0-9_]* skip
+     / &quot;@\&quot;&quot; string_char* &quot;\&quot;&quot;                            skip
+BUILTINIDENTIFIER &lt;- &quot;@&quot;[A-Za-z_][A-Za-z0-9_]* skip
 
 
-AMPERSAND            &lt;- '&'      ![=]      skip
-AMPERSANDEQUAL       &lt;- '&='               skip
+AMPERSAND            &lt;- '&amp;'      ![=]      skip
+AMPERSANDEQUAL       &lt;- '&amp;='               skip
 ASTERISK             &lt;- '*'      ![*%=]    skip
 ASTERISK2            &lt;- '**'               skip
 ASTERISKEQUAL        &lt;- '*='               skip
@@ -11419,7 +11429,7 @@ LARROW2              &lt;- '&lt;&lt;'     ![=]      skip
 LARROW2EQUAL         &lt;- '&lt;&lt;='              skip
 LARROWEQUAL          &lt;- '&lt;='               skip
 LBRACE               &lt;- '{'                skip
-LBRACKET             &lt;- '['      ![*]      skip
+LBRACKET             &lt;- '['                skip
 LPAREN               &lt;- '('                skip
 MINUS                &lt;- '-'      ![%=&gt;]    skip
 MINUSEQUAL           &lt;- '-='               skip
@@ -11436,8 +11446,7 @@ PLUS2                &lt;- '++'               skip
 PLUSEQUAL            &lt;- '+='               skip
 PLUSPERCENT          &lt;- '+%'     ![=]      skip
 PLUSPERCENTEQUAL     &lt;- '+%='              skip
-PTRC                 &lt;- '[*c]'             skip
-PTRUNKNOWN           &lt;- '[*]'              skip
+LETTERC              &lt;- 'c'                skip
 QUESTIONMARK         &lt;- '?'                skip
 RARROW               &lt;- '&gt;'      ![&gt;=]     skip
 RARROW2              &lt;- '&gt;&gt;'     ![=]      skip
@@ -11461,6 +11470,7 @@ KEYWORD_asm         &lt;- 'asm'         end_of_word
 KEYWORD_async       &lt;- 'async'       end_of_word
 KEYWORD_await       &lt;- 'await'       end_of_word
 KEYWORD_break       &lt;- 'break'       end_of_word
+KEYWORD_callconv    &lt;- 'callconv'    end_of_word
 KEYWORD_catch       &lt;- 'catch'       end_of_word
 KEYWORD_comptime    &lt;- 'comptime'    end_of_word
 KEYWORD_const       &lt;- 'const'       end_of_word
@@ -11479,6 +11489,7 @@ KEYWORD_if          &lt;- 'if'          end_of_word
 KEYWORD_inline      &lt;- 'inline'      end_of_word
 KEYWORD_noalias     &lt;- 'noalias'     end_of_word
 KEYWORD_nosuspend   &lt;- 'nosuspend'   end_of_word
+KEYWORD_noinline    &lt;- 'noinline'    end_of_word
 KEYWORD_null        &lt;- 'null'        end_of_word
 KEYWORD_opaque      &lt;- 'opaque'      end_of_word
 KEYWORD_or          &lt;- 'or'          end_of_word
@@ -11503,19 +11514,20 @@ KEYWORD_var         &lt;- 'var'         end_of_word
 KEYWORD_volatile    &lt;- 'volatile'    end_of_word
 KEYWORD_while       &lt;- 'while'       end_of_word
 
-keyword &lt;- KEYWORD_align / KEYWORD_and / KEYWORD_anyframe / KEYWORD_anytype
-         / KEYWORD_allowzero / KEYWORD_asm / KEYWORD_async / KEYWORD_await / KEYWORD_break
-         / KEYWORD_catch / KEYWORD_comptime / KEYWORD_const / KEYWORD_continue
-         / KEYWORD_defer / KEYWORD_else / KEYWORD_enum / KEYWORD_errdefer
-         / KEYWORD_error / KEYWORD_export / KEYWORD_extern / KEYWORD_false
-         / KEYWORD_fn / KEYWORD_for / KEYWORD_if / KEYWORD_inline
-         / KEYWORD_noalias / KEYWORD_null / KEYWORD_opaque / KEYWORD_or
-         / KEYWORD_orelse / KEYWORD_packed / KEYWORD_pub
-         / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection
-         / KEYWORD_struct / KEYWORD_suspend
-         / KEYWORD_switch / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_true / KEYWORD_try
+keyword &lt;- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe
+         / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await
+         / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime
+         / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else
+         / KEYWORD_enum / KEYWORD_errdefer / KEYWORD_error / KEYWORD_export
+         / KEYWORD_extern / KEYWORD_false / KEYWORD_fn / KEYWORD_for / KEYWORD_if
+         / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline
+         / KEYWORD_null / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed
+         / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection
+         / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch
+         / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_true / KEYWORD_try
          / KEYWORD_undefined / KEYWORD_union / KEYWORD_unreachable
-         / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while</code></pre>
+         / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while
+</code></pre>
       {#header_close#}
       {#header_open|Zen#}
       <ul>
lib/std/zig/parse.zig
@@ -488,7 +488,7 @@ const Parser = struct {
         return &node.base;
     }
 
-    /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? EXCLAMATIONMARK? (Keyword_anytype / TypeExpr)
+    /// FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? (Keyword_anytype / TypeExpr)
     fn parseFnProto(p: *Parser, level: enum { top_level, as_type }, fields: struct {
         doc_comments: ?*Node.DocComment = null,
         visib_token: ?TokenIndex = null,
@@ -1023,7 +1023,7 @@ const Parser = struct {
         return p.parseBinOpExpr(parseAssignOp, parseExpr, .Once);
     }
 
-    /// Expr <- KEYWORD_try* BoolOrExpr
+    /// Expr <- BoolOrExpr
     fn parseExpr(p: *Parser) Error!?*Node {
         return p.parsePrefixOpExpr(parseTry, parseBoolOrExpr);
     }
@@ -2758,7 +2758,7 @@ const Parser = struct {
         rparen: TokenIndex,
     };
 
-    /// ArrayTypeStart <- LBRACKET Expr? RBRACKET
+    /// ArrayTypeStart <- LBRACKET Expr? (COLON Expr)? RBRACKET
     fn parseArrayTypeStart(p: *Parser) !?*Node {
         const lbracket = p.eatToken(.LBracket) orelse return null;
         const expr = try p.parseExpr();
@@ -2803,8 +2803,7 @@ const Parser = struct {
     /// PtrTypeStart
     ///     <- ASTERISK
     ///      / ASTERISK2
-    ///      / PTRUNKNOWN
-    ///      / PTRC
+    ///      / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
     fn parsePtrTypeStart(p: *Parser) !?*Node {
         if (p.eatToken(.Asterisk)) |asterisk| {
             const sentinel = if (p.eatToken(.Colon)) |_|