diff options
author | Dan Volkov <die.marmelade@yandex.ru> | 2022-09-29 22:20:59 +0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-29 20:20:59 +0200 |
commit | e24c8cd21ba23f32bfd33dbff4cca55a66097f9d (patch) | |
tree | b3c3f927fc8e4c5b28228637ce405066788fe45b | |
parent | b6ed2be64c1503aed63eb837d59c1318558425e3 (diff) | |
download | pygments-git-e24c8cd21ba23f32bfd33dbff4cca55a66097f9d.tar.gz |
Add fift language (#2249)
-rw-r--r-- | pygments/lexers/_mapping.py | 1 | ||||
-rw-r--r-- | pygments/lexers/fift.py | 68 | ||||
-rw-r--r-- | tests/examplefiles/fift/new-wallet-v3.fif | 44 | ||||
-rw-r--r-- | tests/examplefiles/fift/new-wallet-v3.fif.output | 435 |
4 files changed, 548 insertions, 0 deletions
diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index be3f4d79..223838c2 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -159,6 +159,7 @@ LEXERS = { '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 00000000..c20065c4 --- /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 00000000..af1f94d8 --- /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 ." <workchain-id> <wallet-id> [<filename-base>]" cr + ."Creates a new advanced wallet with unique 32-bit identifier <wallet-id> in specified workchain, with private key saved to or loaded from <filename-base>.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 +<b 0 32 u, subwallet-id 32 u, + file-base +".pk" load-generate-keypair + constant wallet_pk + B, +b> // data +null // no libraries +<b b{0011} s, 3 roll ref, rot ref, swap dict, b> // create StateInit +dup ."StateInit: " <s csr. cr +dup hashu wc swap 2dup 2constant wallet_addr +."new wallet address = " 2dup .addr cr +2dup file-base +".addr" save-address-verbose +."Non-bounceable address (for init): " 2dup 7 .Addr cr +."Bounceable address (for later access): " 6 .Addr cr +<b subwallet-id 32 u, -1 32 i, 0 32 u, b> +dup ."signing message: " <s csr. cr +dup hashu wallet_pk ed25519_sign_uint rot +<b b{1000100} s, wallet_addr addr, b{000010} s, swap <s s, b{0} s, swap B, swap <s s, b> +dup ."External message for initialization is " <s csr. cr +2 boc+>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 00000000..2d8f5f9b --- /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 +' <workchain-id> <wallet-id> [<filename-base>]' Literal.String +'"' Literal.String +' ' Text.Whitespace +'cr' Name +'\n ' Text.Whitespace +'."' Literal.String +'Creates a new advanced wallet with unique 32-bit identifier <wallet-id> in specified workchain, with private key saved to or loaded from <filename-base>.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 + +'<b' Name +' ' Text.Whitespace +'0' Literal.Number.Decimal +' ' Text.Whitespace +'32' Literal.Number.Decimal +' ' Text.Whitespace +'u,' Name +' ' Text.Whitespace +'subwallet-id' Name +' ' Text.Whitespace +'32' Literal.Number.Decimal +' ' Text.Whitespace +'u,' Name +'\n ' Text.Whitespace +'file-base' Name +' ' Text.Whitespace +'+"' Literal.String +'.pk' Literal.String +'"' Literal.String +' ' Text.Whitespace +'load-generate-keypair' Name +'\n ' Text.Whitespace +'constant' Name +' ' Text.Whitespace +'wallet_pk' Name +'\n ' Text.Whitespace +'B,' Name +' \n' Text.Whitespace + +'b>' Name +' ' Text.Whitespace +'// data' Comment.Singleline +'\n' Text.Whitespace + +'null' Name +' ' Text.Whitespace +'// no libraries' Comment.Singleline +'\n' Text.Whitespace + +'<b' Name +' ' Text.Whitespace +'b{0011}' Literal +' ' Text.Whitespace +'s,' Name +' ' Text.Whitespace +'3' Literal.Number.Decimal +' ' Text.Whitespace +'roll' Name +' ' Text.Whitespace +'ref,' Name +' ' Text.Whitespace +'rot' Name +' ' Text.Whitespace +'ref,' Name +' ' Text.Whitespace +'swap' Name +' ' Text.Whitespace +'dict,' Name +' ' Text.Whitespace +'b>' Name +' ' Text.Whitespace +'// create StateInit' Comment.Singleline +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'."' Literal.String +'StateInit: ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'<s' Name +' ' Text.Whitespace +'csr.' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'hashu' Name +' ' Text.Whitespace +'wc' Name +' ' Text.Whitespace +'swap' Name +' ' Text.Whitespace +'2' Literal.Number.Decimal +'dup' Name +' ' Text.Whitespace +'2' Literal.Number.Decimal +'constant' Name +' ' Text.Whitespace +'wallet_addr' Name +'\n' Text.Whitespace + +'."' Literal.String +'new wallet address = ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'2' Literal.Number.Decimal +'dup' Name +' ' Text.Whitespace +'.addr' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'2' Literal.Number.Decimal +'dup' Name +' ' Text.Whitespace +'file-base' Name +' ' Text.Whitespace +'+"' Literal.String +'.addr' Literal.String +'"' Literal.String +' ' Text.Whitespace +'save-address-verbose' Name +'\n' Text.Whitespace + +'."' Literal.String +'Non-bounceable address (for init): ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'2' Literal.Number.Decimal +'dup' Name +' ' Text.Whitespace +'7' Literal.Number.Decimal +' ' Text.Whitespace +'.Addr' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'."' Literal.String +'Bounceable address (for later access): ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'6' Literal.Number.Decimal +' ' Text.Whitespace +'.Addr' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'<b' Name +' ' Text.Whitespace +'subwallet-id' Name +' ' Text.Whitespace +'32' Literal.Number.Decimal +' ' Text.Whitespace +'u,' Name +' ' Text.Whitespace +'-1' Literal.Number.Decimal +' ' Text.Whitespace +'32' Literal.Number.Decimal +' ' Text.Whitespace +'i,' Name +' ' Text.Whitespace +'0' Literal.Number.Decimal +' ' Text.Whitespace +'32' Literal.Number.Decimal +' ' Text.Whitespace +'u,' Name +' ' Text.Whitespace +'b>' Name +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'."' Literal.String +'signing message: ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'<s' Name +' ' Text.Whitespace +'csr.' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'hashu' Name +' ' Text.Whitespace +'wallet_pk' Name +' ' Text.Whitespace +'ed25519_sign_uint' Name +' ' Text.Whitespace +'rot' Name +'\n' Text.Whitespace + +'<b' Name +' ' Text.Whitespace +'b{1000100}' Literal +' ' Text.Whitespace +'s,' Name +' ' Text.Whitespace +'wallet_addr' Name +' ' Text.Whitespace +'addr,' Name +' ' Text.Whitespace +'b{000010}' Literal +' ' Text.Whitespace +'s,' Name +' ' Text.Whitespace +'swap' Name +' ' Text.Whitespace +'<s' Name +' ' Text.Whitespace +'s,' Name +' ' Text.Whitespace +'b{0}' Literal +' ' Text.Whitespace +'s,' Name +' ' Text.Whitespace +'swap' Name +' ' Text.Whitespace +'B,' Name +' ' Text.Whitespace +'swap' Name +' ' Text.Whitespace +'<s' Name +' ' Text.Whitespace +'s,' Name +' ' Text.Whitespace +'b>' Name +'\n' Text.Whitespace + +'dup' Name +' ' Text.Whitespace +'."' Literal.String +'External message for initialization is ' Literal.String +'"' Literal.String +' ' Text.Whitespace +'<s' Name +' ' Text.Whitespace +'csr.' Name +' ' Text.Whitespace +'cr' Name +'\n' Text.Whitespace + +'2' Literal.Number.Decimal +' ' Text.Whitespace +'boc+>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 |