123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- %YAML 1.2
- ---
- #
- # G-Code (RepRap, not ISO-6983)
- # Author: @thinkyhead
- #
- # RapRap G-Code is very simple.
- #
- # TODO: Lines that start with N get a different context, accepting a checksum.
- #
- name: G-Code (RepRap)
- file_extensions:
- - [ g, gco, gcode ]
- scope: source.gcode
- variables:
- decimal: '[+-]?\d+(\.\d*)?'
-
- contexts:
- prototype:
- - match: \s+
-
- - include: mixin_comment
-
- - match: $
- pop: true
-
- main:
- - meta_scope: line.gcode
-
- - match: '([Nn]\s*(\d+))'
- captures:
- 1: entity.nword.gcode
- 2: constant.numeric.line-number.gcode
-
- - match: ()
- set: gcode_command
-
- # G, M, or T command
- gcode_command:
- - meta_content_scope: ctx.command.gcode
-
- # M20 S2 P/path/to/file/name.gco
- - match: ([Mm](20))\s*((S)(2)\s*(P))
- captures:
- 1: entity.command.gcode markup.bold.gcode
- 2: constant.numeric.command.gcode
- 3: ctx.params.gcode
- 4: keyword.param.gcode
- 5: constant.numeric.param.gcode
- 6: keyword.param.gcode
- set: gcode_string_arg
-
- # M117 or M118 - Commands taking a string
- - match: ([Mm]\s*(11[78]))\b
- captures:
- 1: entity.command.gcode markup.bold.gcode
- 2: constant.numeric.command.gcode
- set: gcode_string_arg
-
- # Other commands, followed by data
- - match: ([GMTgmt]\s*(\d+)((\.)(\d+))?)
- captures:
- 1: entity.command.gcode markup.bold.gcode
- 2: constant.numeric.command.gcode
- 4: entity.separator.subcode
- 5: constant.numeric.subcode
- set: gcode_params
-
- - match: ()
- set: syntax_error
-
- # Parameters of a command
- gcode_params:
- - meta_content_scope: ctx.params.gcode
-
- # M32 [S<pos>] [P<bool>] !/path/file.gco#
- - match: \!
- scope: punctuation.string.path.open.gcode
- push: gcode_path_arg
-
- # asterisk starts a checksum
- - match: \*
- scope: punctuation.marker.checksum.gcode
- set: gcode_checksum
-
- # parameter and single-quoted value
- - match: ([A-Za-z])\s*(')
- captures:
- 1: keyword.param.gcode
- 2: punctuation.quote.single.open.gcode
- push: gcode_string_arg_quoted_single
-
- # parameter and double-quoted value
- - match: ([A-Za-z])\s*(")
- captures:
- 1: keyword.param.gcode
- 2: punctuation.quote.double.open.gcode
- push: gcode_string_arg_quoted_double
-
- # parameter and list of values
- - match: ([Ee])\s*(({{decimal}}\s*:\s*)+{{decimal}})
- captures:
- 1: keyword.param.gcode
- 2: constant.numeric.param.gcode
-
- # parameter and numeric value
- - match: ([A-Za-z])\s*({{decimal}})
- captures:
- 1: keyword.param.gcode
- 2: constant.numeric.param.gcode
-
- # parameter with no value
- - match: '[A-Za-z]'
- scope: keyword.param.gcode
- set: gcode_params
-
- - match: ()
- set: syntax_error
-
- gcode_string_arg_quoted_single:
- - meta_content_scope: string.quoted.single.gcode
-
- - match: ([^'\\]+)
-
- - match: (\\)
- scope: punctuation.string.escape.gcode
- push: escape_char
-
- - match: (')
- scope: punctuation.quote.single.close.gcode
- pop: true
-
- - match: ()
- set: syntax_error
-
- gcode_string_arg_quoted_double:
- - meta_content_scope: string.quoted.double.gcode
-
- - match: ([^"\\]+)
-
- - match: (\\)
- scope: punctuation.string.escape.gcode
- push: escape_char
-
- - match: (")
- scope: punctuation.quote.double.close.gcode
- pop: true
-
- - match: ()
- set: syntax_error
-
- gcode_string_arg:
- - meta_content_scope: ctx.string.gcode
-
- - match: ([^;]+)
- scope: string.unquoted.gcode
-
- escape_char:
- - meta_scope: string.escape.gcode punctuation.string.escape.gcode
-
- - match: '.'
- pop: true
-
- gcode_path_arg:
- - meta_content_scope: string.unquoted.path.gcode
-
- - match: (#)
- scope: punctuation.string.path.close.gcode
- pop: true
-
- gcode_checksum:
- - meta_content_scope: constant.numeric.checksum.gcode
- - meta_include_prototype: false
-
- - match: \d+
-
- - match: ( *)$
- pop: true
-
- - include: mixin_comment
-
- - match: ()
- set: syntax_error
-
- # Done interpreting to the end of the line
- gcode_line_done:
- - match: \s*$
- pop: true
-
- # Comments begin with a ';' and finish at the end of the line.
- mixin_comment:
- - match: ^\s*;
- scope: punctuation.comment.line.start
- set: gcode_comment
- - match: \s*;
- scope: punctuation.comment.eol.start
- set: gcode_comment
- - match: \s*\(
- scope: punctuation.paren.comment.open
- push: gcode_comment_paren
-
- # Comment to end of line.
- gcode_comment:
- - meta_content_scope: comment.gcode
- - match: \s*$
- pop: true
-
- gcode_comment_paren:
- - meta_content_scope: paren.comment.gcode
-
- - match: '[^)]+'
-
- - match: '[)]'
- scope: punctuation.paren.comment.close
- pop: true
-
- - match: \s*$
- pop: true
-
- # Everything after this point is broken by a syntax error
- syntax_error:
- - meta_scope: invalid.error.syntax.gcode
-
- - match: .*$
- pop: true
|