You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
5.0 KiB
225 lines
5.0 KiB
%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
|
|
|