我正在处理一个jison文件,并使用pythonply中的lex模块将其转换为解析器生成器。在
我注意到在这个jison文件中,某些令牌有多个关联规则。例如,对于令牌CONTENT
,该文件指定以下三个规则:
[^\x00]*?/("{{") {
if(yytext.slice(-2) === "\\\\") {
strip(0,1);
this.begin("mu");
} else if(yytext.slice(-1) === "\\") {
strip(0,1);
this.begin("emu");
} else {
this.begin("mu");
}
if(yytext) return 'CONTENT';
}
[^\x00]+ return 'CONTENT';
// marks CONTENT up to the next mustache or escaped mustache
<emu>[^\x00]{2,}?/("{{"|"\\{{"|"\\\\{{"|<<EOF>>) {
this.popState();
return 'CONTENT';
}
在另一种情况下,COMMENT
令牌有多个规则:
当这些规则适用于不同的州时,很容易区分它们,但是当它们适用于同一个州时呢?在
如何使用ply.lex?在
编辑
如果有帮助,这个jison文件是把手.js源代码。参见:https://github.com/wycats/handlebars.js/blob/master/src/handlebars.l
这个问题很难回答,也是两个问题合一。在
Jison(这是handlebars解析器使用的语言,而不是bison)有一些在其他lexer中没有的特性,特别是在PLY中没有。这使得您很难将所显示的词汇代码从Jison转换为PLY。然而,这不是你关注的问题。可以回答您的基本问题,多个正则表达式如何在PLY中返回单个标记,但这并不能为您提供实现您选择的示例代码的解决方案!在
首先,让我们谈谈你问的问题。为PLY中的多个正则表达式返回一个标记可以由PLY中的
@TOKEN
修饰符完成,如PLY manual(第4.11节)所示。在例如,我们可以执行以下操作:
但是,这对jison中的规则并不起作用,因为它们使用了jison的一个新特性,即start conditions(参见Jison Manual)。这里,短语}的来源。在PLY中没有这样的功能。在
this.begin
用于引入一个状态名,然后可以在模式的其他地方使用。这就是<mu>
、<emu>
和{为了匹配这些词素,确实有必要回到手柄/小胡子语言/符号的语法并创建新的正则表达式。不知怎的,我觉得完全重新实现整个车把为你在一个如此的答案可能是一步太远。在
然而,我已经为你和其他任何踏上这条道路的人确定了解决方案的步骤。在
相关问题 更多 >
编程相关推荐