abnf.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. Language: Augmented Backus-Naur Form
  3. Author: Alex McKibben <alex@nullscope.net>
  4. Website: https://tools.ietf.org/html/rfc5234
  5. Audit: 2020
  6. */
  7. /** @type LanguageFn */
  8. function abnf(hljs) {
  9. const regex = hljs.regex;
  10. const IDENT = /^[a-zA-Z][a-zA-Z0-9-]*/;
  11. const KEYWORDS = [
  12. "ALPHA",
  13. "BIT",
  14. "CHAR",
  15. "CR",
  16. "CRLF",
  17. "CTL",
  18. "DIGIT",
  19. "DQUOTE",
  20. "HEXDIG",
  21. "HTAB",
  22. "LF",
  23. "LWSP",
  24. "OCTET",
  25. "SP",
  26. "VCHAR",
  27. "WSP"
  28. ];
  29. const COMMENT = hljs.COMMENT(/;/, /$/);
  30. const TERMINAL_BINARY = {
  31. scope: "symbol",
  32. match: /%b[0-1]+(-[0-1]+|(\.[0-1]+)+)?/
  33. };
  34. const TERMINAL_DECIMAL = {
  35. scope: "symbol",
  36. match: /%d[0-9]+(-[0-9]+|(\.[0-9]+)+)?/
  37. };
  38. const TERMINAL_HEXADECIMAL = {
  39. scope: "symbol",
  40. match: /%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+)?/
  41. };
  42. const CASE_SENSITIVITY = {
  43. scope: "symbol",
  44. match: /%[si](?=".*")/
  45. };
  46. const RULE_DECLARATION = {
  47. scope: "attribute",
  48. match: regex.concat(IDENT, /(?=\s*=)/)
  49. };
  50. const ASSIGNMENT = {
  51. scope: "operator",
  52. match: /=\/?/
  53. };
  54. return {
  55. name: 'Augmented Backus-Naur Form',
  56. illegal: /[!@#$^&',?+~`|:]/,
  57. keywords: KEYWORDS,
  58. contains: [
  59. ASSIGNMENT,
  60. RULE_DECLARATION,
  61. COMMENT,
  62. TERMINAL_BINARY,
  63. TERMINAL_DECIMAL,
  64. TERMINAL_HEXADECIMAL,
  65. CASE_SENSITIVITY,
  66. hljs.QUOTE_STRING_MODE,
  67. hljs.NUMBER_MODE
  68. ]
  69. };
  70. }
  71. module.exports = abnf;