summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Volkov <die.marmelade@yandex.ru>2022-09-29 22:20:59 +0400
committerGitHub <noreply@github.com>2022-09-29 20:20:59 +0200
commite24c8cd21ba23f32bfd33dbff4cca55a66097f9d (patch)
treeb3c3f927fc8e4c5b28228637ce405066788fe45b
parentb6ed2be64c1503aed63eb837d59c1318558425e3 (diff)
downloadpygments-git-e24c8cd21ba23f32bfd33dbff4cca55a66097f9d.tar.gz
Add fift language (#2249)
-rw-r--r--pygments/lexers/_mapping.py1
-rw-r--r--pygments/lexers/fift.py68
-rw-r--r--tests/examplefiles/fift/new-wallet-v3.fif44
-rw-r--r--tests/examplefiles/fift/new-wallet-v3.fif.output435
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