verilog.go

 1package v
 2
 3import (
 4	. "github.com/alecthomas/chroma" // nolint
 5	"github.com/alecthomas/chroma/lexers/internal"
 6)
 7
 8// Verilog lexer.
 9var Verilog = internal.Register(MustNewLexer(
10	&Config{
11		Name:      "verilog",
12		Aliases:   []string{"verilog", "v"},
13		Filenames: []string{"*.v"},
14		MimeTypes: []string{"text/x-verilog"},
15		EnsureNL:  true,
16	},
17	Rules{
18		"root": {
19			{"^\\s*`define", CommentPreproc, Push("macro")},
20			{`\n`, Text, nil},
21			{`\s+`, Text, nil},
22			{`\\\n`, Text, nil},
23			{`/(\\\n)?/(\n|(.|\n)*?[^\\]\n)`, CommentSingle, nil},
24			{`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil},
25			{`[{}#@]`, Punctuation, nil},
26			{`L?"`, LiteralString, Push("string")},
27			{`L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'`, LiteralStringChar, nil},
28			{`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?`, LiteralNumberFloat, nil},
29			{`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil},
30			{`([0-9]+)|(\'h)[0-9a-fA-F]+`, LiteralNumberHex, nil},
31			{`([0-9]+)|(\'b)[01]+`, LiteralNumberBin, nil},
32			{`([0-9]+)|(\'d)[0-9]+`, LiteralNumberInteger, nil},
33			{`([0-9]+)|(\'o)[0-7]+`, LiteralNumberOct, nil},
34			{`\'[01xz]`, LiteralNumber, nil},
35			{`\d+[Ll]?`, LiteralNumberInteger, nil},
36			{`\*/`, Error, nil},
37			{`[~!%^&*+=|?:<>/-]`, Operator, nil},
38			{`[()\[\],.;\']`, Punctuation, nil},
39			{"`[a-zA-Z_]\\w*", NameConstant, nil},
40			{`^(\s*)(package)(\s+)`, ByGroups(Text, KeywordNamespace, Text), nil},
41			{`^(\s*)(import)(\s+)`, ByGroups(Text, KeywordNamespace, Text), Push("import")},
42			{Words(``, `\b`, `always`, `always_comb`, `always_ff`, `always_latch`, `and`, `assign`, `automatic`, `begin`, `break`, `buf`, `bufif0`, `bufif1`, `case`, `casex`, `casez`, `cmos`, `const`, `continue`, `deassign`, `default`, `defparam`, `disable`, `do`, `edge`, `else`, `end`, `endcase`, `endfunction`, `endgenerate`, `endmodule`, `endpackage`, `endprimitive`, `endspecify`, `endtable`, `endtask`, `enum`, `event`, `final`, `for`, `force`, `forever`, `fork`, `function`, `generate`, `genvar`, `highz0`, `highz1`, `if`, `initial`, `inout`, `input`, `integer`, `join`, `large`, `localparam`, `macromodule`, `medium`, `module`, `nand`, `negedge`, `nmos`, `nor`, `not`, `notif0`, `notif1`, `or`, `output`, `packed`, `parameter`, `pmos`, `posedge`, `primitive`, `pull0`, `pull1`, `pulldown`, `pullup`, `rcmos`, `ref`, `release`, `repeat`, `return`, `rnmos`, `rpmos`, `rtran`, `rtranif0`, `rtranif1`, `scalared`, `signed`, `small`, `specify`, `specparam`, `strength`, `string`, `strong0`, `strong1`, `struct`, `table`, `task`, `tran`, `tranif0`, `tranif1`, `type`, `typedef`, `unsigned`, `var`, `vectored`, `void`, `wait`, `weak0`, `weak1`, `while`, `xnor`, `xor`), Keyword, nil},
43			{Words("`", `\b`, `accelerate`, `autoexpand_vectornets`, `celldefine`, `default_nettype`, `else`, `elsif`, `endcelldefine`, `endif`, `endprotect`, `endprotected`, `expand_vectornets`, `ifdef`, `ifndef`, `include`, `noaccelerate`, `noexpand_vectornets`, `noremove_gatenames`, `noremove_netnames`, `nounconnected_drive`, `protect`, `protected`, `remove_gatenames`, `remove_netnames`, `resetall`, `timescale`, `unconnected_drive`, `undef`), CommentPreproc, nil},
44			{Words(`\$`, `\b`, `bits`, `bitstoreal`, `bitstoshortreal`, `countdrivers`, `display`, `fclose`, `fdisplay`, `finish`, `floor`, `fmonitor`, `fopen`, `fstrobe`, `fwrite`, `getpattern`, `history`, `incsave`, `input`, `itor`, `key`, `list`, `log`, `monitor`, `monitoroff`, `monitoron`, `nokey`, `nolog`, `printtimescale`, `random`, `readmemb`, `readmemh`, `realtime`, `realtobits`, `reset`, `reset_count`, `reset_value`, `restart`, `rtoi`, `save`, `scale`, `scope`, `shortrealtobits`, `showscopes`, `showvariables`, `showvars`, `sreadmemb`, `sreadmemh`, `stime`, `stop`, `strobe`, `time`, `timeformat`, `write`), NameBuiltin, nil},
45			{Words(``, `\b`, `byte`, `shortint`, `int`, `longint`, `integer`, `time`, `bit`, `logic`, `reg`, `supply0`, `supply1`, `tri`, `triand`, `trior`, `tri0`, `tri1`, `trireg`, `uwire`, `wire`, `wand`, `woshortreal`, `real`, `realtime`), KeywordType, nil},
46			{`[a-zA-Z_]\w*:(?!:)`, NameLabel, nil},
47			{`\$?[a-zA-Z_]\w*`, Name, nil},
48		},
49		"string": {
50			{`"`, LiteralString, Pop(1)},
51			{`\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})`, LiteralStringEscape, nil},
52			{`[^\\"\n]+`, LiteralString, nil},
53			{`\\\n`, LiteralString, nil},
54			{`\\`, LiteralString, nil},
55		},
56		"macro": {
57			{`[^/\n]+`, CommentPreproc, nil},
58			{`/[*](.|\n)*?[*]/`, CommentMultiline, nil},
59			{`//.*?\n`, CommentSingle, Pop(1)},
60			{`/`, CommentPreproc, nil},
61			{`(?<=\\)\n`, CommentPreproc, nil},
62			{`\n`, CommentPreproc, Pop(1)},
63		},
64		"import": {
65			{`[\w:]+\*?`, NameNamespace, Pop(1)},
66		},
67	},
68))