0

我正在使用 jison 文件并使用 python PLY 的 lex 模块将其转换为解析器生成器。

我注意到在这个 jison 文件中,某些令牌有多个与之关联的规则。例如,对于 token 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在另一种情况下,令牌有多个规则:

<com>[\s\S]*?"--}}"              strip(0,4); this.popState(); return 'COMMENT';
<mu>"{{!--"                      this.popState(); this.begin('com');
<mu>"{{!"[\s\S]*?"}}"            strip(3,5); this.popState(); return 'COMMENT';

当它们适用于不同的州时,区分规则似乎很容易,但是当它们适用于同一个州时呢?

如何使用 ply.lex 将此 jison 转换为 python 规则?

编辑

如果有帮助,这个 jison 文件是 handlebars.js 源代码的一部分。见:https ://github.com/wycats/handlebars.js/blob/master/src/handlebars.l

4

1 回答 1

0

这个问题很难回答;这也是两个问题合而为一。

Jison(这是编写车把解析器的语言,而不是野牛)具有其他词法分析器中没有的一些功能,特别是在 PLY 中没有。这使得将您显示的词法代码从 Jison 转换为 PLY 变得很困难。但是,这不是您关注的问题。可以回答您的基本问题,多个正则表达式如何在 PLY 中返回单个标记,但这不会为您提供实现您选择作为示例的代码的解决方案!

首先,让我们解决您提出的问题。在 PLY 中为多个正则表达式返回一个标记可以由 PLY 中的@TOKEN装饰器完成,如PLY 手册(第 4.11 节)所示。

例如,我们可以执行以下操作:

comment1 = r'[^\x00]*?/("{{")'
comment2 = r'[^\x00]+'
comment = r'(' + comment1 + r'|' + comment2 + r')'

@TOKEN(comment)
def t_COMMENT(t)
 ....

但是,这对于您从 jison 获得的规则实际上并不适用,因为它们使用了 jison 的一个新功能,称为开始条件(请参阅 Jison手册)。在这里,该短语this.begin用于介绍州名,然后可以在模式中的其他地方使用。这就是<mu>,<emu><com>的来源。PLY 中没有这样的功能。

为了匹配这些词位,确实有必要回到把手/小胡子语言/符号的语法并创建新的正则表达式。不知何故,我认为在 SO 答案中为您完全重新实现整个车把可能是一个太过分的步骤。

但是,我已经为您和其他任何走这条路的人确定了解决方案的步骤。

于 2015-03-23T23:18:03.147 回答