问题描述
我一直在纠结为什么我正在编写的基于 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”之后没有任何尾随空格,则输出为:
OTOH,如果以上内容在 HTML 中呈现 在“?A=CW”之后尾随空格,则 Pygments 将“GOYES”标记为词法错误,并且输出如下:
如果我尝试让 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”呈现为词法错误,原因未知我。输出如下所示:
此外,如果我在具有“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')
]
}
上面的输出如下:
在一个不相关的主题上,我不知道如何在使用“bygroups”操作的同时获得检查寄存器对是否有效的回调。
任何帮助将不胜感激,
谢谢,
jdb2
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)