...

Source file src/github.com/alecthomas/chroma/lexers/p/plutus_core.go

Documentation: github.com/alecthomas/chroma/lexers/p

     1  package p
     2  
     3  import (
     4  	. "github.com/alecthomas/chroma" // nolint
     5  	"github.com/alecthomas/chroma/lexers/internal"
     6  )
     7  
     8  // nolint
     9  
    10  // Lexer for the Plutus Core Languages (version 2.1)
    11  //
    12  // including both Typed- and Untyped- versions
    13  // based on “Formal Specification of the Plutus Core Language (version 2.1)”, published 6th April 2021:
    14  // https://hydra.iohk.io/build/8205579/download/1/plutus-core-specification.pdf
    15  
    16  var PlutusCoreLang = internal.Register(MustNewLazyLexer(
    17  	&Config{
    18  		Name:      "Plutus Core",
    19  		Aliases:   []string{"plutus-core", "plc"},
    20  		Filenames: []string{"*.plc"},
    21  		MimeTypes: []string{"text/x-plutus-core", "application/x-plutus-core"},
    22  	},
    23  	plutusCoreRules,
    24  ))
    25  
    26  func plutusCoreRules() Rules {
    27  	return Rules{
    28  		"root": {
    29  			{`\s+`, Text, nil},
    30  			{`(\(|\))`, Punctuation, nil},
    31  			{`(\[|\])`, Punctuation, nil},
    32  			{`({|})`, Punctuation, nil},
    33  
    34  			// Constants. Figure 1.
    35  			// For version, see handling of (program ...) below.
    36  			{`([+-]?\d+)`, LiteralNumberInteger, nil},
    37  			{`(#([a-fA-F0-9][a-fA-F0-9])+)`, LiteralString, nil},
    38  			{`(\(\))`, NameConstant, nil},
    39  			{`(True|False)`, NameConstant, nil},
    40  
    41  			// Keywords. Figures 2 and 15.
    42  			// Special handling for program because it is followed by a version.
    43  			{`(con |abs |iwrap |unwrap |lam |builtin |delay |force |error)`, Keyword, nil},
    44  			{`(fun |all |ifix |lam |con )`, Keyword, nil},
    45  			{`(type|fun )`, Keyword, nil},
    46  			{`(program )(\S+)`, ByGroups(Keyword, LiteralString), nil},
    47  
    48  			// Built-in Types. Figure 12.
    49  			{`(unit|bool|integer|bytestring|string)`, KeywordType, nil},
    50  
    51  			// Built-ins Functions. Figure 14 but, more importantly, implementation:
    52  			// https://github.com/input-output-hk/plutus/blob/6d759c4/plutus-core/plutus-core/src/PlutusCore/Default/Builtins.hs#L42-L111
    53  			{`(addInteger |subtractInteger |multiplyInteger |divideInteger |quotientInteger |remainderInteger |modInteger |equalsInteger |lessThanInteger |lessThanEqualsInteger )`, NameBuiltin, nil},
    54  			{`(appendByteString |consByteString |sliceByteString |lengthOfByteString |indexByteString |equalsByteString |lessThanByteString |lessThanEqualsByteString )`, NameBuiltin, nil},
    55  			{`(sha2_256 |sha3_256 |blake2b_256 |verifySignature )`, NameBuiltin, nil},
    56  			{`(appendString |equalsString |encodeUtf8 |decodeUtf8 )`, NameBuiltin, nil},
    57  			{`(ifThenElse )`, NameBuiltin, nil},
    58  			{`(chooseUnit )`, NameBuiltin, nil},
    59  			{`(trace )`, NameBuiltin, nil},
    60  			{`(fstPair |sndPair )`, NameBuiltin, nil},
    61  			{`(chooseList |mkCons |headList |tailList |nullList )`, NameBuiltin, nil},
    62  			{`(chooseData |constrData |mapData |listData |iData |bData |unConstrData |unMapData |unListData |unIData |unBData |equalsData )`, NameBuiltin, nil},
    63  			{`(mkPairData |mkNilData |mkNilPairData )`, NameBuiltin, nil},
    64  
    65  			// Name. Figure 1.
    66  			{`([a-zA-Z][a-zA-Z0-9_']*)`, Name, nil},
    67  
    68  			// Unicode String. Not in the specification.
    69  			{`"`, LiteralStringDouble, Push("string")},
    70  		},
    71  		"string": {
    72  			{`[^\\"]+`, LiteralStringDouble, nil},
    73  			{`"`, LiteralStringDouble, Pop(1)},
    74  		},
    75  	}
    76  }
    77  

View as plain text