PageSourceSearch

https://0xc0ffee.netlify.app/assets/14-numeric-lit.html-Bg-wlSrc.js

js 0xc0ffee.netlify.app collected 2026-10-03 10:22:54 UTC 35,767 bytes, 114 lines download raw bytes

1import{_ as s,c as a,e,o as p}from"./app-CjUkjRdW.js";const t="/assets/numeric-literals-XjO89fvy.png",l="/assets/custom-numeric-lit-BhYjtDgu.png",o={};function c(i,n){return p(),a("div",null,n[0]||(n[0]=[e(`<h1 id="numeric-literals" tabindex="-1"><a class="header-anchor" href="#numeric-literals"><span>Numeric Literals</span></a></h1><p>Numeric literals in Nim have specific rules, as specified in the <a href="https://nim-lang.org/docs/manual.html#lexical-analysis-numeric-literals" target="_blank" rel="noopener noreferrer">Nim manual</a>. The rules are as follows:</p><ul><li>A numeric literal is a sequence of digits, possibly containing underscores.</li><li>A numeric literal can have a type suffix, e.g. <code>1234&#39;i32</code>, <code>1234&#39;u64</code>, <code>1234&#39;f32</code>.</li><li>Nim supports decimal, binary, octal, and hexadecimal literals, using a prefix to specify the base. The prefixes are <code>0b</code>, <code>0o</code>, and <code>0x</code>, respectively (no prefix means decimal).</li><li>Floating point literals can have a decimal point, an exponent (<code>e</code> or <code>E</code>), or both.</li><li>Unary minus is part of the literal, but must be preceded by a specific set of characters.</li><li>Nim supports custom numeric literals (we&#39;ll come to this later).</li></ul><p>Here are some examples of numeric literals in Nim:</p><div class="language-nim line-numbers-mode" data-highlighter="prismjs" data-ext="nim" data-title="nim"><pre><code><span class="line"><span class="token keyword">let</span></span>
2<span class="line">  a <span class="token operator">=</span> <span class="token number">1_234</span>         <span class="token comment"># decimal</span></span>
3<span class="line">  b <span class="token operator">=</span> <span class="token number">0b1010</span>        <span class="token comment"># binary</span></span>
4<span class="line">  c <span class="token operator">=</span> <span class="token number">0o123</span>         <span class="token comment"># octal</span></span>
5<span class="line">  d <span class="token operator">=</span> <span class="token number">0x1A</span>          <span class="token comment"># hex</span></span>
6<span class="line">  e <span class="token operator">=</span> <span class="token number">1234.567</span>      <span class="token comment"># float</span></span>
7<span class="line">  f <span class="token operator">=</span> <span class="token number">1.234e5</span>       <span class="token comment"># float (with exponent)</span></span>
8<span class="line">  g <span class="token operator">=</span> <span class="token number">1.234E-5</span>      <span class="token comment"># float (with negative exponent)</span></span>
9<span class="line">  h <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1234</span>         <span class="token comment"># negative decimal (unary minus)</span></span>
10<span class="line">  i <span class="token operator">=</span> <span class="token number">1234&#39;u64</span>      <span class="token comment"># unsigned 64-bit integer</span></span>
11<span class="line">  j <span class="token operator">=</span> <span class="token number">1234&#39;i64</span>      <span class="token comment"># signed 64-bit integer</span></span>
12<span class="line">  k <span class="token operator">=</span> <span class="token number">1.234&#39;f32</span>     <span class="token comment"># 32-bit float</span></span>
13<span class="line">  l <span class="token operator">=</span> <span class="token number">1.234e-4&#39;f64</span>  <span class="token comment"># 64-bit float</span></span>
14<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="lexer-changes" tabindex="-1"><a class="header-anchor" href="#lexer-changes"><span>Lexer Changes</span></a></h2><p>Let&#39;s start by defining the tokens for numeric literals. We&#39;ll need two tokens: one for integer literals and one for floating point literals.</p><div class="language-kotlin line-numbers-mode" data-highlighter="prismjs" data-ext="kt" data-title="kt"><pre><code><span class="line"><span class="token comment">
14// src/main/kotlin/khaledh/nimjet/lexer/NimToken.kt</span></span>
15<span class="line"><span class="token operator">..</span><span class="token punctuation">.</span></span>
16<span class="line"></span>
17<span class="line"><span class="token keyword">interface</span> NimToken <span class="token punctuation">{</span></span>
18<span class="line">    <span class="token keyword">companion</span> <span class="token keyword">object</span> <span class="token punctuation">{</span></span>
19<span class="line">        <span class="token operator">..</span><span class="token punctuation">.</span></span>
20<span class="line"></span>
21<span class="line">        <span class="token comment">// numeric literals</span></span>
22<span class="line">        <span class="token annotation builtin">@JvmField</span> <span class="token keyword">val</span> INT_LIT <span class="token operator">=</span> <span class="token function">NimTokenType</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">&quot;&lt;int&gt;&quot;</span></span><span class="token punctuation">)</span></span>
23<span class="line">        <span class="token annotation builtin">@JvmField</span> <span class="token keyword">val</span> FLOAT_LIT <span class="token operator">=</span> <span class="token function">NimTokenType</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">&quot;&lt;float&gt;&quot;</span></span><span class="token punctuation">)</span></span>
24<span class="line"></span>
25<span class="line">        <span class="token operator">..</span><span class="token punctuation">.</span></span>
26<span class="line">    <span class="token punctuation">}</span></span>
27<span class="line"><span class="token punctuation">}</span></span>
28<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Next, we&#39;ll define the regular expressions for integer and floating point literals in the JFlex spec file.</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><span class="token comment">// src/main/kotlin/lexer/Nim.flex</span></span>
29<span class="line"><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
30<span class="line"></span>
31<span class="line"><span class="token comment">// numeric literals</span></span>
32<span class="line"><span class="token class-name">Digit</span>           <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token operator">-</span><span class="token number">9</span><span class="token punctuation">]</span></span>
33<span class="line"><span class="token class-name">BinDigit</span>        <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">01</span><span class="token punctuation">]</span></span>
34<span class="line"><span class="token class-name">OctDigit</span>        <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token operator">-</span><span class="token number">7</span><span class="token punctuation">]</span></span>
35<span class="line"><span class="token class-name">HexDigit</span>        <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token operator">-</span><span class="token number">9</span>a<span class="token operator">-</span>fA<span class="token operator">-</span><span class="token class-name">F</span><span class="token punctuation">]</span></span>
36<span class="line"></span>
37<span class="line"><span class="token class-name">DecNum</span>
37          <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token class-name">Digit</span><span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token string">&quot;_&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">Digit</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token operator">*</span></span>
38<span class="line"><span class="token class-name">BinNum</span>          <span class="token operator">=</span> <span class="token string">&quot;0&quot;</span> <span class="token punctuation">[</span>bB<span class="token punctuation">]</span> <span class="token punctuation">{</span><span class="token class-name">BinDigit</span><span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token string">&quot;_&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">BinDigit</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token operator">*</span></span>
39<span class="line"><span class="token class-name">OctNum</span>          <span class="token operator">=</span> <span class="token string">&quot;0&quot;</span> <span class="token punctuation">[</span>o<span class="token punctuation">]</span> <span class="token punctuation">{</span><span class="token class-name">OctDigit</span><span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token string">&quot;_&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">OctDigit</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token operator">*</span></span>
40<span class="line"><span class="token class-name">HexNum</span>          <span class="token operator">=</span> <span class="token string">&quot;0&quot;</span> <span class="token punctuation">[</span>xX<span class="token punctuation">]</span> <span class="token punctuation">{</span><span class="token class-name">HexDigit</span><span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token string">&quot;_&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">HexDigit</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token operator">*</span></span>
41<span class="line"></span>
42<span class="line"><span class="token class-name">IntNum</span>          <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token class-name">DecNum</span><span class="token punctuation">}</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">BinNum</span><span class="token punctuation">}</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">OctNum</span><span class="token punctuation">}</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">HexNum</span><span class="token punctuation">}</span></span>
43<span class="line"><span class="token class-name">IntSuffix</span>       <span class="token operator">=</span> \\&#39;<span class="token operator">?</span> <span class="token punctuation">[</span>iIuU<span class="token punctuation">]</span> <span class="token punctuation">(</span><span class="token number">8</span> <span class="token operator">|</span> <span class="token number">16</span> <span class="token operator">|</span> <span class="token number">32</span> <span class="token operator">|</span> <span class="token number">64</span><span class="token punctuation">)</span></span>
44<span class="line"><span class="token class-name">IntLit</span>          <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token class-name">IntNum</span><span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token class-name">IntSuffix</span><span class="token punctuation">}</span><span class="token operator">?</span></span>
45<span class="line"></span>
46<span class="line"><span class="token class-name">Exp</span>
46             <span class="token operator">=</span> <span class="token punctuation">[</span>eE<span class="token punctuation">]</span> <span class="token punctuation">[</span><span class="token operator">+</span>\\<span class="token operator">-</span><span class="token punctuation">]</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">DecNum</span><span class="token punctuation">}</span></span>
47<span class="line"><span class="token class-name">FloatNum</span>        <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token class-name">DecNum</span><span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token string">&quot;\\.&quot;</span> <span class="token punctuation">{</span><span class="token class-name">DecNum</span><span class="token punctuation">}</span> <span class="token punctuation">{</span><span class="token class-name">Exp</span><span class="token punctuation">}</span><span class="token operator">?</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">Exp</span><span class="token punctuation">}</span><span class="token punctuation">)</span></span>
48<span class="line"><span class="token class-name">FloatSuffix</span>     <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">[</span>fF<span class="token punctuation">]</span> <span class="token punctuation">(</span><span class="token number">32</span> <span class="token operator">|</span> <span class="token number">64</span><span class="token punctuation">)</span> <span class="token operator">|</span> <span class="token punctuation">[</span>dD<span class="token punctuation">]</span><span class="token punctuation">)</span></span>
49<span class="line"><span class="token class-name">FloatLit</span>        <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token class-name">FloatNum</span><span class="token punctuation">}</span></span>
50<span class="line">                <span class="token operator">|</span> <span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token class-name">FloatNum</span><span class="token punctuation">}</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">DecNum</span><span class="token punctuation">}</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">OctNum</span><span class="token punctuation">}</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">BinNum</span><span class="token punctuation">}</span><span class="token punctuation">)</span> \\&#39;<span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">FloatSuffix</span><span class="token punctuation">}</span></span>
51<span class="line">                <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">HexNum</span><span class="token punctuation">}</span> \\&#39; <span class="token punctuation">{</span><span class="token class-name">FloatSuffix</span><span class="token punctuation">}</span></span>
52<span class="line"></span>
53<span class="line"><span class="token operator">%</span><span class="token operator">%</span></span>
54<span class="line"></span>
55<span class="line"><span class="token generics"><span class="token punctuation">&lt;</span>DEFAULT<span class="token punctuation">&gt;</span></span> <span class="token punctuation">{</span></span>
56<span class="line">  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
57<span class="line"></span>
58<span class="line">  <span class="token string">&quot;-&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">IntLit</span><span class="token punctuation">}</span>
58                  <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name">NimToken</span><span class="token punctuation">.</span><span class="token constant">INT_LIT</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></span>
59<span class="line">  <span class="token string">&quot;-&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">FloatLit</span><span class="token punctuation">}</span>                <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name">NimToken</span><span class="token punctuation">.</span><span class="token constant">FLOAT_LIT</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></span>
60<span class="line"></span>
61<span class="line">  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
62<span class="line"><span class="token punctuation">}</span></span>
63<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The regexes should be fairly straightforward to understand. The only one that might look a bit odd is the <code>FloatLit</code> regex, which has three alternatives. The first is a floating point literal (i.e. with a decimal point and/or exponent), the second adds decimal, octal, or binary literals, but requires a type suffix (since the absence of a suffix would make it an integer literal), and the third is a hexadecimal literal with a mandatory apostrophe and type suffix (since the float type suffix starts with a valid hex digit).</p><p>The rules are also simple, they include an optional unary minus followed by either an integer or floating point literal. There are, however, cases when a minus character can mean an operator, so we&#39;ll have to handle that later when we add support for operators.</p><h2 id="grammar-changes" tabindex="-1"><a class="header-anchor" href="#grammar-changes"><span>Grammar Changes</span></a></h2><p>So far we only support string literals in the grammar. Let&#39;s add support for numeric literals as well, so we can initialize variables with them.</p><div class="language-bnf line-numbers-mode" data-highlighter="prismjs" data-ext="bnf" data-title="bnf"><pre><code><span class="line">// src/main/kotlin/khaledh/nimjet/parser/Nim.bnf</span>
64<span class="line"><span class="token operator">...</span></span>
65<span class="line"></span>
66<span class="line">IdentDef          <span class="token operator">::=</span> IdentDecl EQ Literal DocComment<span class="token operator">?</span></span>
67<span class="line"><span class="token operator">...</span></span>
68<span class="line"></span>
69<span class="line">Literal           <span class="token operator">::=</span> INT_LIT <span class="token operator">|</span> FLOAT_LIT <span class="token operator">|</span> STRING_LIT</span>
70<span class="line"><span class="token operator">...</span></span>
71<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>We moved the existing <code>STRING_LIT</code> token along with the new <code>INT_LIT</code> and <code>FLOAT_LIT</code> tokens into the <code>Literal</code> rule, and updated the <code>IdentDef</code> rule to use it instead.</p><p>Let&#39;s test it out.</p><p><img src="`+t+`" alt="Numeric Literals"></p><p>Looks good! We can now use numeric literals in our code.</p><h2 id="custom-numeric-literals" tabindex="-1"><a class="header-anchor" href="#custom-numeric-literals"><span>Custom Numeric Literals</span></a></h2><p>Nim allows you to define custom numeric literals by defining a proc (or other callable) with the same name as the literal prefixed with the <code>&#39;</code> character. For example:</p><div class="language-nim line-numbers-mode" data-highlighter="prismjs" data-ext="nim" data-title="nim"><pre><code><span class="line"><span class="token keyword">type</span> u4 <span class="token operator">=</span> <span class="token keyword">distinct</span> uint8 <span class="token comment"># a 4-bit unsigned integer</span></span>
72<span class="line"></span>
73<span class="line"><span class="token keyword">proc</span> <span class="token function">\`&#39;u4\`</span><span class="token punctuation">(</span>n<span class="token operator">:</span> string<span class="token punctuation">)</span><span class="token operator">:</span> u4 <span class="token operator">=</span></span>
74<span class="line">  <span class="token operator">...</span></span>
75<span class="line"></span>
76<span class="line"><span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token number">5&#39;u4</span></span>
77<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, <code>5&#39;u4</code> is a custom numeric literal that calls the <code>&#39;u4</code> proc with the string <code>&quot;5&quot;</code> as an argument. The proc then converts the string to a <code>u4</code> value (possibly with some validation).</p><p>Let&#39;s add a new token for custom numeric literals.</p><div class="language-kotlin line-numbers-mode" data-highlighter="prismjs" data-ext="kt" data-title="kt"><pre><code><span class="line"><span class="token keyword">interface</span> NimToken <span class="token punctuation">{</span></span>
78<span class="line">    <span class="token keyword">companion</span> <span class="token keyword">object</span> <span class="token punctuation">{</span></span>
79<span class="line">
79        <span class="token operator">..</span><span class="token punctuation">.</span></span>
80<span class="line"></span>
81<span class="line">        <span class="token comment">// numeric literals</span></span>
82<span class="line">        <span class="token annotation builtin">@JvmField</span> <span class="token keyword">val</span> INT_LIT <span class="token operator">=</span> <span class="token function">NimTokenType</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">&quot;&lt;int&gt;&quot;</span></span><span class="token punctuation">)</span></span>
83<span class="line">        <span class="token annotation builtin">@JvmField</span> <span class="token keyword">val</span> FLOAT_LIT <span class="token operator">=</span> <span class="token function">NimTokenType</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">&quot;&lt;float&gt;&quot;</span></span><span class="token punctuation">)</span></span>
84<span class="line highlighted">        <span class="token annotation builtin">@JvmField</span> <span class="token keyword">val</span> CUSTOM_NUMERIC_LIT <span class="token operator">=</span> <span class="token function">NimTokenType</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">&quot;&lt;custom numeric&gt;&quot;</span></span><span class="token punctuation">)</span></span>
85<span class="line"></span>
86<span class="line">        <span class="token operator">..</span><span class="token punctuation">.</span></span>
87<span class="line">    <span class="token punctuation">}</span></span>
88<span class="line"><span class="token punctuation">}</span></span>
89<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>We&#39;ll also need to update the lexer to recognize custom numeric literals. We&#39;ll need to add a regex for identifiers so that we can use it to match the custom numeric callable. We&#39;ll use the same regex in the existing rule that matches regular identifiers.</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre><code><span class="line"><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
90<span class="line"></span>
91<span class="line highlighted"><span class="token class-name">Identifier</span>      <span class="token operator">=</span> <span class="token punctuation">[</span>a<span class="token operator">-</span>zA<span class="token operator">-</span><span class="token class-name">Z</span><span class="token punctuation">]</span><span class="token punctuation">[</span>a<span class="token operator">-</span>zA<span class="token operator">-</span><span class="token constant">Z0</span><span class="token operator">-</span><span class="token number">9</span><span class="token punctuation">]</span><span class="token operator">*</span></span>
92<span class="line"><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
93<span class="line"></span>
94<span class="line highlighted"><span class="token class-name">CustomNumLit</span>   <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token class-name">IntLit</span><span class="token punctuation">}</span> <span class="token operator">|</span> <span class="token punctuation">{</span><span class="token class-name">FloatLit</span><span class="token punctuation">}</span><span class="token punctuation">)</span> \\&#39; <span class="token punctuation">{</span><span class="token class-name">Identifier</span><span class="token punctuation">}</span></span>
95<span class="line"></span>
96<span class="line"><span class="token operator">%</span><span class="token operator">%</span></span>
97<span class="line"><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
98<span class="line"></span>
99<span class="line"><span class="token generics"><span class="token punctuation">&lt;</span>DEFAULT<span class="token punctuation">&gt;</span></span> <span class="token punctuation">{</span></span>
100<span class="line">  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
101<span class="line"></span>
102<span class="line">  <span class="token string">&quot;-&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">IntLit</span><span class="token punctuation">}</span>
102                  <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name">NimToken</span><span class="token punctuation">.</span><span class="token constant">INT_LIT</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></span>
103<span class="line">  <span class="token string">&quot;-&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">FloatLit</span><span class="token punctuation">}</span>                <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name">NimToken</span><span class="token punctuation">.</span><span class="token constant">FLOAT_LIT</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></span>
104<span class="line highlighted">  <span class="token string">&quot;-&quot;</span><span class="token operator">?</span> <span class="token punctuation">{</span><span class="token class-name">CustomNumLit</span><span class="token punctuation">}</span>            <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name">NimToken</span><span class="token punctuation">.</span><span class="token constant">CUSTOM_NUMERIC_LIT</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></span>
105<span class="line">  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
106<span class="line"></span>
107<span class="line highlighted">  <span class="token punctuation">{</span><span class="token class-name">Identifier</span><span class="token punctuation">}</span>                   <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token class-name">NimToken</span><span class="token punctuation">.</span><span class="token constant">IDENT</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></span>
108<span class="line">  <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
109<span class="line"><span class="token punctuation">}</span></span>
110<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Finally, let&#39;s add the new token to the <code>Literal</code> rule in the grammar.</p><div class="language-bnf line-numbers-mode" data-highlighter="prismjs" data-ext="bnf" data-title="bnf"><pre><code><span class="line"><span class="token operator">...</span></span>
111<span class="line"></span>
112<span class="line">Literal           <span class="token operator">::=</span> INT_LIT <span class="token operator">|</span> FLOAT_LIT <span class="token operator">|</span> CUSTOM_NUMERIC_LIT <span class="token operator">|</span> STRING_LIT</span>
113<span class="line"><span class="token operator">...</span></span>
114<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Let&#39;s test it out.</p><p><img src="`+l+'" alt="Custom Numeric Literal"></p><p>Great! All seems to be working as expected.</p>',32)]))}const u=s(o,[["render",c],["__file","14-numeric-lit.html.vue"]]),k=JSON.parse(`{"path":"/nimjet/14-numeric-lit.html","title":"Numeric Literals","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"Lexer Changes","slug":"lexer-changes","link":"#lexer-changes","children":[]},{"level":2,"title":"Grammar Changes","slug":"grammar-changes","link":"#grammar-changes","children":[]},{"level":2,"title":"Custom Numeric Literals","slug":"custom-numeric-literals","link":"#custom-numeric-literals","children":[]}
114],"git":{"updatedTime":1728748746000},"filePathRelative":"nimjet/14-numeric-lit.md","excerpt":"\\n<p>Numeric literals in Nim have specific rules, as specified in the\\n<a href=\\"https://nim-lang.org/docs/manual.html#lexical-analysis-numeric-literals\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">Nim manual</a>.\\nThe rules are as follows:</p>\\n<ul>\\n<li>A numeric literal is a sequence of digits, possibly containing underscores.</li>\\n<li>A numeric literal can have a type suffix, e.g. <code>1234'i32</code>, <code>1234'u64</code>, <code>1234'f32</code>.</li>\\n<li>Nim supports decimal, binary, octal, and hexadecimal literals, using a prefix to\\nspecify the base. The prefixes are <code>0b</code>, <code>0o</code>, and <code>0x</code>, respectively (no prefix\\nmeans decimal).</li>\\n<li>Floating point literals can have a decimal point, an exponent (<code>e</code> or <code>E</code>), or both.</li>\\n<li>Unary minus is part of the literal, but must be preceded by a specific set of\\ncharacters.</li>\\n<li>Nim supports custom numeric literals (we'll come to this later).</li>\\n</ul>"}`);export{u as comp,k as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.