From e8701195e66f2d27ffe17fb514eae8173795aaf7 Mon Sep 17 00:00:00 2001 From: Georgiy Bondarenko <69736697+nehilo@users.noreply.github.com> Date: Thu, 4 Mar 2021 22:54:23 +0500 Subject: Initial commit --- .../sublime/RepRapTools/G-Code.sublime-syntax | 225 +++++++++++++++++++++ .../sublime/RepRapTools/syntax_test_G-code.gcode | 106 ++++++++++ 2 files changed, 331 insertions(+) create mode 100644 buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax create mode 100644 buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode (limited to 'buildroot/share/sublime/RepRapTools') diff --git a/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax b/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax new file mode 100644 index 0000000..d1571e3 --- /dev/null +++ b/buildroot/share/sublime/RepRapTools/G-Code.sublime-syntax @@ -0,0 +1,225 @@ +%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] [P] !/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 diff --git a/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode b/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode new file mode 100644 index 0000000..643f271 --- /dev/null +++ b/buildroot/share/sublime/RepRapTools/syntax_test_G-code.gcode @@ -0,0 +1,106 @@ +; SYNTAX TEST "G-code.sublime-syntax" + +; This is a G-code comment +;^comment + +G1 X100 Y100 ; Move to 100,100 +;^entity.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^comment + +T0 (This is a comment) S12 +;^entity.command.gcode +; ^punctuation.paren.comment.open +; ^paren.comment.gcode +; ^punctuation.paren.comment.close +; ^keyword.param.gcode +; ^constant.numeric.param.gcode + +M20 P'/path/to/macro/macro.g' R12 +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^punctuation.quote.single.open.gcode +; ^string.quoted.single.gcode +; ^punctuation.quote.single.close.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode + +M117 This is a message ; and comment +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^string.unquoted.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode + +M118 This is a message ; and comment +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^string.unquoted.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode + +M98 P'/path/to/macro/macro.g' R12 +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^punctuation.quote.single.open.gcode +; ^string.quoted.single.gcode +; ^punctuation.quote.single.close.gcode + +M98 P"/path/to/macro/macro.g" R12 +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^punctuation.quote.double.open.gcode +; ^string.quoted.double.gcode +; ^punctuation.quote.double.close.gcode + +M32 S100 P0 !/path/file.gco# +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.string.path.open.gcode +; ^string.unquoted.path.gcode +; ^punctuation.string.path.close.gcode + +G28 ; Home All +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode + +N123 G1 X5 Y0 *64 ; EOL Comment +;<-entity.nword.gcode +;^constant.numeric.line-number.gcode +; ^entity.command.gcode +; ^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.marker.checksum.gcode +; ^constant.numeric.checksum.gcode + +N234 G1 X-5 Y+2 *64 error +;<-entity.nword.gcode +;^constant.numeric.line-number.gcode +; ^entity.command.gcode +; ^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.marker.checksum.gcode +; ^constant.numeric.checksum.gcode +; ^invalid.error.syntax.gcode + +N234 M107 *64 +; ^-invalid.error.syntax.gcode + +M92 E304.5:304.5:420:420:420:420 ; EOL Comment +;<-entity.command.gcode +;^constant.numeric.command.gcode +; ^keyword.param.gcode +; ^constant.numeric.param.gcode +; ^constant.numeric.param.gcode +; ^punctuation.comment.eol.start +; ^comment.gcode -- cgit v1.2.3