Pygments 空白和回调地狱

问题描述

我一直在纠结为什么我正在编写的基于 Pygments 的 Saturn 汇编词法分析器不能使用空格。此外,我一直试图让回调和“bygroups”构造同时工作,但没有成功。

我已经用谷歌搜索并广泛研究了这篇文章中提出的问题,但我还没有找到解决方案。

样本输入是:

*This is a test comment
    ?A=C    W
    GOYES   lbl1      This is a another test comment...
lbl1

这里是一个“有效”的代码示例,除非在“?A=C W”之后有任何尾随空格:

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

class SasmJazzLexer(RegexLexer):
    name = 'SASM'
    aliases = ['SASM','Sasm','sasm','JAZZ','Jazz','jazz']
    filenames = ['*.A','*.a']

    comparison_ops = ['<','>','<=','>=','#','=']
    fields = ['P','WP','XS','X','S','M','B','W','A']

    ws1 = r'^ {2,}'
    ws2 = r'([ \t]+.*)|$'

    goto_label = r'([ \t]+[a-zA-Z][a-zA-Z0-9]{,11})'
    label_def = r'(^ ?[a-zA-Z][a-zA-Z0-9]{,11})([ \t]+|$)(.*)'

    def check_comp_regs_callback(lexer,match):
        valid_comp_regs = {('A','B'),('A','C'),('B','A'),('C','D'),('D','C')}
        valid = 0
        reg1 = match.group(1)
        reg2 = match.group(3)
        whole_match = match.group()
        if (reg1,reg2) in valid_comp_regs:
            valid = 1
        if not valid:
            yield match.start,Error,whole_match
        else:
            yield match.start(),Keyword,whole_match
    
    tokens = {
        'root' : [
            (r'^\*.*$',Comment.Single),(ws1 + r'\?' r'(' r'[A-D]' r')' r'(' + r'|'.join(i for i in comparison_ops) + r')' r'(' r'[A-D]' r')' r'[ \t]+' r'(' +  r'|'.join(i for i in fields) + r')' r'(([ \t]+.*)|\n)',check_comp_regs_callback,'conditional'),(label_def,bygroups(Name.Label,Whitespace,Comment))
        ],'conditional' : [
            (r'(' + ws1 + r'GOYES)' + goto_label + r'(' + ws2 + r')',bygroups(Keyword,Name.Label,Comment),'#pop'),(r'(' + ws1 + r'RTNYES)' r'(' + ws2 + r')','#pop')
        ]
    }

如果上述内容在 HTML 中呈现,在“?A=C W”之后没有任何尾随空格,则输出为:

Output of Pygments from above test input

OTOH,如果以上内容在 HTML 中呈现 在“?A=CW”之后尾随空格,则 Pygments 将“GOYES”标记为词法错误,并且输出如下:

Output from Pygments from above test input

如果我尝试让 Pygments 使用 'bygroups' 构造分解指令的部分,那么以下代码部分有效:

from pygments.lexer import RegexLexer,(ws1 + r'(\?)' r'(' r'[A-D]' r')' r'(' + r'|'.join(i for i in comparison_ops) + r')' r'(' r'[A-D]' r')' r'[ \t]+' r'(' +  r'|'.join(i for i in fields) + r')' r'(([ \t]+.*)|\n)',bygroups(Punctuation,Name.Builtin,Operator,'#pop')
        ]
    }

上面的问题是“bygroups”操作似乎破坏了空格。此外,虽然尾随空格被消耗并且语法标记为对指令的“?A=CW”部分有效,但在下一行,Pygments 将“GOYES”或“RTNYES”呈现为词法错误,原因未知我。输出如下所示:

Output of Pygments from above test input

此外,如果我在具有“bygroups”构造的正则表达式匹配组中包含空格,则空格不会被破坏,尽管我认为这是由于 Pygments 未处理所述正则表达式内容并将上述内容呈现为词法错误.此外,无论我如何修改与“?A=CW”字符串匹配的正则表达式(至少以某种方式修改它以便空格仍包含在正则表达式匹配组中),Pygments 将其标记为词法错误

from pygments.lexer import RegexLexer,(r'(' + ws1 + r'\?)' r'(' r'[A-D]' r')' r'(' + r'|'.join(i for i in comparison_ops) + r')' r'(' r'[A-D]' r')' r'([ \t]+' +  r'|'.join(i for i in fields) + r')' r'(([ \t]+.*)|\n)','#pop')
        ]
    }

上面的输出如下:

Output of Pygments from the above test input

一个不相关的主题上,我不知道如何在使用“bygroups”操作的同时获得检查寄存器对是否有效的回调。

任何帮助将不胜感激,

谢谢,

jdb2

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)