diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index be3f4d7953..223838c27f 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -159,6 +159,7 @@ 'FantomLexer': ('pygments.lexers.fantom', 'Fantom', ('fan',), ('*.fan',), ('application/x-fantom',)), 'FelixLexer': ('pygments.lexers.felix', 'Felix', ('felix', 'flx'), ('*.flx', '*.flxh'), ('text/x-felix',)), 'FennelLexer': ('pygments.lexers.lisp', 'Fennel', ('fennel', 'fnl'), ('*.fnl',), ()), + 'FiftLexer': ('pygments.lexers.fift', 'Fift', ('fift', 'fif'), ('*.fif',), ()), 'FishShellLexer': ('pygments.lexers.shell', 'Fish', ('fish', 'fishshell'), ('*.fish', '*.load'), ('application/x-fish',)), 'FlatlineLexer': ('pygments.lexers.dsls', 'Flatline', ('flatline',), (), ('text/x-flatline',)), 'FloScriptLexer': ('pygments.lexers.floscript', 'FloScript', ('floscript', 'flo'), ('*.flo',), ()), diff --git a/pygments/lexers/fift.py b/pygments/lexers/fift.py new file mode 100644 index 0000000000..c20065c4aa --- /dev/null +++ b/pygments/lexers/fift.py @@ -0,0 +1,68 @@ +""" + pygments.lexers.fift + ~~~~~~~~~~~~~~~~~~~~ + + Lexers for fift. + + :copyright: Copyright 2006-2022 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, include, words +from pygments.token import Literal, Comment, Name, String, \ + Number, Whitespace + +__all__ = ['FiftLexer'] + + +class FiftLexer(RegexLexer): + """ + For Fift source code. + """ + + name = 'Fift' + aliases = ['fift', 'fif'] + filenames = ['*.fif'] + url = 'https://ton-blockchain.github.io/docs/fiftbase.pdf' + + tokens = { + 'root': [ + (r'\s+', Whitespace), + + include('comments'), + + (r'[\.+]?\"', String, 'string'), + + # numbers + (r'0x[0-9a-fA-F]+', Number.Hex), + (r'0b[01]+', Number.Bin), + (r'-?[0-9]+("/"-?[0-9]+)?', Number.Decimal), + + # slices + (r'b\{[01]+\}', Literal), + (r'x\{[0-9a-fA-F_]+\}', Literal), + + # byte literal + (r'B\{[0-9a-fA-F_]+\}', Literal), + + # treat anything as word + (r'\S+', Name) + ], + + 'string': [ + (r'\\.', String.Escape), + (r'\"', String, '#pop'), + (r'[^\"\r\n\\]+', String) + ], + + 'comments': [ + (r'//.*', Comment.Singleline), + (r'/\*', Comment.Multiline, 'comment'), + ], + 'comment': [ + (r'[^/*]+', Comment.Multiline), + (r'/\*', Comment.Multiline, '#push'), + (r'\*/', Comment.Multiline, '#pop'), + (r'[*/]', Comment.Multiline), + ], + } diff --git a/tests/examplefiles/fift/new-wallet-v3.fif b/tests/examplefiles/fift/new-wallet-v3.fif new file mode 100644 index 0000000000..af1f94d8ba --- /dev/null +++ b/tests/examplefiles/fift/new-wallet-v3.fif @@ -0,0 +1,44 @@ +"TonUtil.fif" include +"Asm\".fif" include + +0x01 0xaC 0b0001 b{0101} x{eBac0c} B{eBaC0C} + +{ ."usage: " $0 type ." []" cr + ."Creates a new advanced wallet with unique 32-bit identifier in specified workchain, with private key saved to or loaded from .pk" cr + ."('new-wallet.pk' by default)" cr 1 halt +} : usage +$# 2- -2 and ' usage if + +3 :$1..n +$1 parse-workchain-id =: wc // set workchain id from command line argument +$2 parse-int =: subwallet-id +$3 "new-wallet" replace-if-null =: file-base + +."Creating new advanced v3 wallet in workchain " wc . cr +."with unique wallet id " subwallet-id . cr + +// Create new advanced wallet; code adapted from `auto/wallet3-code.fif` +"wallet-v3-code.fif" include +// >libref +// code + // data +null // no libraries + // create StateInit +dup ."StateInit: " +dup ."signing message: " +dup ."External message for initialization is " B dup Bx. cr +file-base +"-query.boc" tuck B>file +."(Saved wallet creating query to file " type .")" cr diff --git a/tests/examplefiles/fift/new-wallet-v3.fif.output b/tests/examplefiles/fift/new-wallet-v3.fif.output new file mode 100644 index 0000000000..2d8f5f9ba1 --- /dev/null +++ b/tests/examplefiles/fift/new-wallet-v3.fif.output @@ -0,0 +1,435 @@ +'"' Literal.String +'TonUtil.fif' Literal.String +'"' Literal.String +' ' Text.Whitespace +'include' Name +'\n' Text.Whitespace + +'"' Literal.String +'Asm' Literal.String +'\\"' Literal.String.Escape +'.fif' Literal.String +'"' Literal.String +' ' Text.Whitespace +'include' Name +'\n\n' Text.Whitespace + +'0x01' Literal.Number.Hex +' ' Text.Whitespace +'0xaC' Literal.Number.Hex +' ' Text.Whitespace +'0b0001' Literal.Number.Bin +' ' Text.Whitespace +'b{0101}' Literal +' ' Text.Whitespace +'x{eBac0c}' Literal +' ' Text.Whitespace +'B{eBaC0C}' Literal +'\n\n' Text.Whitespace + +'{' Name +' ' Text.Whitespace +'."' Literal.String +'usage: ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'$0' Name +' ' Text.Whitespace +'type' Name +' ' Text.Whitespace +'."' Literal.String +' []' Literal.String +'"' Literal.String +' ' Text.Whitespace +'cr' Name +'\n ' Text.Whitespace +'."' Literal.String +'Creates a new advanced wallet with unique 32-bit identifier in specified workchain, with private key saved to or loaded from .pk' Literal.String +'"' Literal.String +' ' Text.Whitespace +'cr' Name +'\n ' Text.Whitespace +'."' Literal.String +"('new-wallet.pk' by default)" Literal.String +'"' Literal.String +' ' Text.Whitespace +'cr' Name +' ' Text.Whitespace +'1' Literal.Number.Decimal +' ' Text.Whitespace +'halt' Name +'\n' Text.Whitespace + +'}' Name +' ' Text.Whitespace +':' Name +' ' Text.Whitespace +'usage' Name +'\n' Text.Whitespace + +'$#' Name +' ' Text.Whitespace +'2' Literal.Number.Decimal +'-' Name +' ' Text.Whitespace +'-2' Literal.Number.Decimal +' ' Text.Whitespace +'and' Name +' ' Text.Whitespace +"'" Name +' ' Text.Whitespace +'usage' Name +' ' Text.Whitespace +'if' Name +'\n\n' Text.Whitespace + +'3' Literal.Number.Decimal +' ' Text.Whitespace +':$1..n' Name +'\n' Text.Whitespace + +'$1' Name +' ' Text.Whitespace +'parse-workchain-id' Name +' ' Text.Whitespace +'=:' Name +' ' Text.Whitespace +'wc' Name +' ' Text.Whitespace +'// set workchain id from command line argument' Comment.Singleline +'\n' Text.Whitespace + +'$2' Name +' ' Text.Whitespace +'parse-int' Name +' ' Text.Whitespace +'=:' Name +' ' Text.Whitespace +'subwallet-id' Name +'\n' Text.Whitespace + +'$3' Name +' ' Text.Whitespace +'"' Literal.String +'new-wallet' Literal.String +'"' Literal.String +' ' Text.Whitespace +'replace-if-null' Name +' ' Text.Whitespace +'=:' Name +' ' Text.Whitespace +'file-base' Name +'\n\n' Text.Whitespace + +'."' Literal.String +'Creating new advanced v3 wallet in workchain ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'wc' Name +' ' Text.Whitespace +'.' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'."' Literal.String +'with unique wallet id ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'subwallet-id' Name +' ' Text.Whitespace +'.' Name +' ' Text.Whitespace +'cr' Name +'\n\n' Text.Whitespace + +'// Create new advanced wallet; code adapted from `auto/wallet3-code.fif`' Comment.Singleline +'\n' Text.Whitespace + +'"' Literal.String +'wallet-v3-code.fif' Literal.String +'"' Literal.String +' ' Text.Whitespace +'include' Name +'\n' Text.Whitespace + +'// >libref' Comment.Singleline +'\n' Text.Whitespace + +'// code' Comment.Singleline +'\n' Text.Whitespace + +'' Name +' ' Text.Whitespace +'// data' Comment.Singleline +'\n' Text.Whitespace + +'null' Name +' ' Text.Whitespace +'// no libraries' Comment.Singleline +'\n' Text.Whitespace + +'' Name +' ' Text.Whitespace +'// create StateInit' Comment.Singleline +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'."' Literal.String +'StateInit: ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'' Name +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'."' Literal.String +'signing message: ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'' Name +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'."' Literal.String +'External message for initialization is ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'B' Name +' ' Text.Whitespace +'dup' Name +' ' Text.Whitespace +'Bx.' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'file-base' Name +' ' Text.Whitespace +'+"' Literal.String +'-query.boc' Literal.String +'"' Literal.String +' ' Text.Whitespace +'tuck' Name +' ' Text.Whitespace +'B>file' Name +'\n' Text.Whitespace + +'."' Literal.String +'(Saved wallet creating query to file ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'type' Name +' ' Text.Whitespace +'."' Literal.String +')' Literal.String +'"' Literal.String +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace