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'i32</code>, <code>1234'u64</code>, <code>1234'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'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'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'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'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'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's start by defining the tokens for numeric literals. We'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">"<int>"</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">"<float>"</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'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">"_"</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">"0"</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">"_"</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">"0"</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">"_"</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">"0"</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">"_"</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> \\'<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">"\\."</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> \\'<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> \\' <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"><</span>DEFAULT<span class="token punctuation">></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">"-"</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">"-"</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'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'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'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>'</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">\`'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'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'u4</code> is a custom numeric literal that calls the <code>'u4</code> proc with the string <code>"5"</code> as an argument. The proc then converts the string to a <code>u4</code> value (possibly with some validation).</p><p>Let'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">"<int>"</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">"<float>"</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">"<custom numeric>"</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'll also need to update the lexer to recognize custom numeric literals. We'll need to add a regex for identifiers so that we can use it to match the custom numeric callable. We'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> \\' <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"><</span>DEFAULT<span class="token punctuation">></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">"-"</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">"-"</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">"-"</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'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'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.