Article #824

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

Prismの拡張

posted by sakurai on June 25, 2024 #824

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: /(\+|\-|\!|\~|\&|\~\&|\||\~\||\^|\~\^|\^\~|\*|\/|\%|\<\<|\>\>|\<\=|\>\=|\<|\>|\=\=|\!\=|\&\&|\|\|)/
  }
};

左矢前のブログ 次のブログ右矢

Leave a Comment

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.