25 |
Prismの拡張 |
bsvのコードハイライティングを行う際に、Prism.jsを利用しました。ただしbsvはなくverilogまでなので、以下のjsを追加して文法を拡張しています。
bsv対応のcssやjsはChatGPTに作成してもらい人間がデバッグしました。ChatGPTはあっという間にほぼ完成度の高いcssやjsを作成するのですが、どうしてもバグが残ります。それをChatGPTに取らせるには却って工数がかかるので、人間がとってやったほうが今のところ全体工数が少なくて済みます。
そのためにはChatGPTをスーパーバイズする必要があるので、ChatGPTよりも知識が上である必要があります。つまり「ChatGPTには知ってることを聞け=知らないことを聞くな」と言うことです。
ソースコード
Prism.languages.bsv = {
'comment': [
{
pattern: /\/\/.*/,
alias: 'comment'
},
{
pattern: /\/\*[\s\S]*?\*\//,
alias: 'comment'
}
],
'module-name-outer': {
pattern: /(\bmodule\s+|endmodule\s*:\s*)([a-z_]\w*)/,
inside: {
'keyword': /\b(?:module|endmodule)\b/,
'punctuation': /:/,
'module-name': /\b[a-z_]\w*\b/
}
},
'interface-name-outer': {
pattern: /(\binterface\s+|endinterface\s*:\s*)([A-Z]\w*)/,
inside: {
'keyword': /\b(?:interface|endinterface)\b/,
'punctuation': /:/,
'interface-name': /\b[A-Z]\w*\b/
}
},
'package-name-outer': {
pattern: /(\bpackage\s+|endpackage\s*:\s+|import\s+)([A-Z]\w*)/,
inside: {
'keyword': /\b(?:package|endpackage|import)\b/,
'punctuation': /:/,
'package-name': /\b[A-Z]\w*\b/
}
},
'rule-name-outer': {
pattern: /(\brule\s+|endrule\s*:\s*)([a-z_]\w*)/,
inside: {
'keyword': /\b(?:rule|endrule)\b/,
'punctuation': /:/,
'rule-name': /\b[a-z_]\w*\b/
}
},
'method-name-outer': {
pattern: /(\bmethod\s+|endmethod\s*:\s*)([a-z_]\w*)/,
inside: {
'keyword': /\b(?:method|endmethod)\b/,
'punctuation': /:/,
'method-name': /\b[a-z_]\w*\b/
}
},
'return-variable': {
pattern: /(\breturn\s+)([a-z_]\w*)/,
inside: {
'keyword': /\breturn\b/,
'variable': /\b[a-z_]\w*\b/
}
},
'keyword': {
pattern: /\b(?:action|endaction|await|clocked_by|default_clock|deriving|else|function|endfunction|import|if|inout|input|interface|endinterface|match|method|endmethod|module|endmodule|no_clock|output|package|parameter|provisos|register|rule|endrule|rules|struct|type|typedef|union|value_of|var|while|seq|endseq|endpackage|return|let|case|endcase|delay|noAction|for|continue)\b/,
},
'right-hand-variable': {
pattern: /([a-z_]\w*)\s*(?=\s*<=)/,
alias: 'variable'
},
'right-hand-variable-operator': {
pattern: /(\s*<=\s*)([a-z_]\w*)/,
inside: {
'operator': /<=/,
'variable': /\b[a-z_]\w*\b/
}
},
'generator-variable': {
pattern: /([a-z_]\w*)\s*(?=\s*<-\s*)/,
alias: 'variable'
},
'generator-operator': {
pattern: /(\s*<-\s*)([a-z_]\w*)/,
inside: {
'operator': /<-/,
'function': /\b[a-z_]\w*\b/
}
},
'assignment-variable': {
pattern: /([a-z_]\w*)\s*(?=\s*<=)/,
alias: 'variable'
},
'function-definition': {
pattern: /(?:\bfunction\s+\w+\s+)([a-z_]\w*)/,
alias: 'function'
},
'system-function': {
pattern: /\$\w+/,
alias: 'function'
},
'function-call': {
pattern: /(\b[a-z_]\w*)(?=\s*\()/,
alias: 'function'
},
'function-call-no-parens': {
pattern: /\b[a-z_]\w*(?=\s*;)/,
alias: 'function'
},
'type': {
pattern: /\b(Bit#\(\d+\)|UInt#\(\d+\)|Int#\(\d+\)|Bool|Maybe|Tuple2|Tuple3|Tuple4|Tuple5|Tuple6|Tuple7|Tuple8|Vector|Vector#\(\d+\)|Integer|Real|String|Fmt|Reg|FIFO|Clock|Reset|Inout|Action|ActionValue|Rules|UInt|Int)\b/,
alias: 'type'
},
'directive': {
pattern: /\(\*[\s\S]*?\*\)/,
inside: {
'comment': {
pattern: /(\(\*|\*\))/,
alias: 'comment'
},
'string': {
pattern: /[\s\S]+/,
alias: 'string'
}
}
},
'number': {
pattern: /\b\d+(\.\d+)?([eE][+-]?\d+)?\b/,
alias: 'number'
},
'class-name': {
pattern: /\b[A-Z][a-zA-Z0-9_]*\b/,
alias: 'class-name'
},
'string': {
pattern: /(^|[^\\])(["'`])(?:\\.|(?!\2)[^\\\r\n])*\2/
},
'operator': {
pattern: /(\+|\-|\!|\~|\&|\~\&|\||\~\||\^|\~\^|\^\~|\*|\/|\%|\<\<|\>\>|\<\=|\>\=|\<|\>|\=\=|\!\=|\&\&|\|\|)/
}
};