lexer 正则表达式 pygments g-code

Posted

技术标签:

【中文标题】lexer 正则表达式 pygments g-code【英文标题】:lexer regular expression pygments g-code 【发布时间】:2016-07-07 18:14:34 【问题描述】:

我正在尝试在 Pygments 上创建一个非常简单的词法分析器 http://pygments.org/docs/lexerdevelopment/ 这样我就可以在做一些有用的事情时获得一些 Python 经验,然后继续创建一个更复杂的。词法分析器用于 g 代码,我能够:

突出显示行的 cmets(但不是块 cmets); 突出显示 M 和 G 命令(但不突出显示其他命令 X、Y、Z 等。

这里是 gcodelexer.py

from pygments.lexer import RegexLexer
from pygments.token import *

__all__ = ['gcodeLexer']

class gcodeLexer(RegexLexer):
    name = 'g-code'
    aliases = ['gcode']
    filenames = ['*.gcode']

    tokens = 
        'root': [
            (r' .*\n', Text),
            (r';.*$', Comment),
            (r'^[gmtGMT]\d1,4\s',Name.Builtin), # M or G commands
            (r'[^gGmM][+-]?\d*[.]?\d+', Keyword), # other commands
            # (r'\+.*\n', Generic.Inserted),
            # (r'-.*\n', Generic.Deleted),
            # (r'@.*\n', Generic.Subheading),
            # (r'Index.*\n', Generic.Heading),
            # (r'=.*\n', Generic.Heading),
            (r'.*\n', Text),
        ]
    

基本上,“其他命令”只能找到每行两个或三个中的第一个,我不明白为什么......我还试图找到每个标记的描述(关键字、名称、运算符等,但是没有成功)。他们的名字应该是不言自明的吗?

谢谢

更新:当前版本

from pygments.lexer import RegexLexer
from pygments.token import *

__all__ = ['gcodeLexer']

class gcodeLexer(RegexLexer):
    name = 'g-code'
    aliases = ['gcode']
    filenames = ['*.gcode']

    tokens = 
        'root': [
            (r'^;.*$', Comment),
            (r'\s;.*', Comment.Multiline, 'blockcomment'),
            (r'^[gmtGMT]\d1,4\s',Name.Builtin), # M or G commands
            (r'[^gGmM][+-]?\d*[.]?\d+', Keyword),
            (r'\s', Text.Whitespace),
            (r'.*\n', Text),
        ],
        'blockcomment': [
            (r'.*;.*$', Comment.Multiline, '#pop'),
            (r'^.*\n', Comment.Multiline),
            (r'.', Comment.Multiline),
        ]
    

[IMG]http://i64.tinypic.com/2h4j7lw.png[/IMG]

M190 S50.000000
M109 S250.000000
;Sliced at: Sun 03-07-2016 17:55:50
;Basic settings: Layer height: 0.3 Walls: 1.2 Fill: 20
;Print time: 1 hour 9 minutes
;Filament used: 2.584m 20.0g
;Filament cost: 0.37
;M190 S50 ;Uncomment to add your own bed temperature line
;M109 S250 ;Uncomment to add your own temperature line
G21        ;metric values
G90        ;absolute positioning
M82        ;set extruder to absolute mode
G28 X0 Y0  ;move X/Y to min endstops
G0 X100 Y100
G28 Z0     ;move Z to min endstops
G29
G1 Z15.0 F100 ;move the platform down 15mm
G92 E0                  ;zero the extruded length
G1 F200 E3              ;extrude 3mm of feed stock
G92 E0                  ;zero the extruded length again
G1 F10800
;Put printing message on LCD screen
;?IF_EXT0?M109 T0 S?TEMP0?
M117 Printing...

;Layer count: 19
;LAYER:0
M107
G0 F10800 X48.217 Y22.131 Z0.300
;TYPE:SKIRT
G1 F1800 X48.687 Y21.229 E0.01913
G1 X48.936 Y20.744 E0.02939
G1 X49.723 Y19.693 E0.05409
G1 X50.013 Y19.303 E0.06323
G1 X51.064 Y18.293 E0.09065
G1 X51.455 Y17.957 E0.10034

【问题讨论】:

我实际上只是写了一个解析 gcode 的正则表达式语句,它将处理所有 G 和 M 代码以及 X、Y、Z、I、J、K 和 F 代码。这是我使用的正则表达式:(G|M|X|Y|Z|I|J|K|F)(?<val>-?\d*\.?\d+\.?) 你可以检查第一组是 G 还是 M,然后第二组会给你具体的代码。如果您可以发布一些示例 gcode,我会看看我是否可以对其进行编辑以也适用于您。 谢谢 Xander,不过我认为有很多额外的代码(从 A 到 Z)en.wikipedia.org/wiki/G-code#Letter_addresses 虽然比您使用的频率低。我遇到的问题是第一个文本正则表达式。我将拥有我当前的版本。你有什么修改建议吗?也许不同的令牌?谢谢 [^GMgm0-9](?:-?\d*\.?\d+\.?) 应该是您正在寻找的检测非 G 和 M 代码命令的内容。检测您可以使用的任何命令([A-z])(?<val>-?\d*\.?\d+\.?) 【参考方案1】:

对于任何需要 gcode 词法分析器的人来说,这是在 @Xander 的帮助下。如果你想为它的改进做出贡献,这里是官方 github repository

from pygments.lexer import RegexLexer
from pygments.token import *

__all__ = ['gcodeLexer']

class gcodeLexer(RegexLexer):
    name = 'g-code'
    aliases = ['gcode']
    filenames = ['*.gcode']

    tokens = 
        'root': [
            (r'^;.*$', Comment),
            (r'\s;.*', Comment.Multiline, 'blockcomment'),
            (r'^[gmtGMT]\d1,4\s',Name.Builtin), # M or G commands
            (r'[^gGmM][+-]?\d*[.]?\d+', Keyword),
            (r'\s', Text.Whitespace),
            (r'.*\n', Text),
        ],
        'blockcomment': [
            (r'.*;.*$', Comment.Multiline, '#pop'),
            (r'^.*\n', Comment.Multiline),
            (r'.', Comment.Multiline),
        ]
    

【讨论】:

以上是关于lexer 正则表达式 pygments g-code的主要内容,如果未能解决你的问题,请参考以下文章

Pygments 中 Java Lexer 的 analyse_text() 函数

cx_Freeze:Python 错误主脚本。找不到模块错误:没有名为 pygments.lexers.python 的模块

使用 Pygments 检测代码片段的编程语言

将 Pygments 正则表达式翻译成 JFlex

Python 中带有 Pygments 的分词器

Pygments 在 pre 中向 HTML 添加空格