在以前的Jison版本中,可能具有类似于Flex的功能,该功能允许定义可在词法分析器和解析器上下文中访问的变量,例如:

%{
var chars = 0;
var words = 0;
var lines = 0;
%}

%lex
%options flex

%%
\s
[^ \t\n\r\f\v]+ { words++; chars+= yytext.length; }
. { chars++; }
\n { chars++; lines++ }
/lex

%%
E : { console.log(lines + "\t" + words + "\t" + chars) ; };


参考:Flex like features?

尽管在最新版本的Jison中这是无效的。无法从解析器上下文访问charswordslines,从而产生错误。

在搜索有关新版本的更多信息时,我发现应该可以通过在解析器的上下文中在%{ ... %}内定义输出来实现,但是尽管它用于多行语句,但是它不起作用。我正在从源代码生成目标语言的代码,然后将这些代码美化,应用由范围控制的正确缩进,并直接从解析器生成,而无需构建AST。

全局定义当前在Jison中如何工作?

最佳答案

当前版本的Jison具有variable named yy,其目的是允许在词法操作,语义操作和其他模块之间共享数据。如果将所有这些变量存储在yy中,则代码示例可以正常工作,如下所示:

%lex
%options flex

%{
if (!('chars' in yy)) {
  yy.chars = 0;
  yy.words = 0;
  yy.lines = 1;
}
%}

%%
[^ \t\n\r\f\v]+ { yy.words++; yy.chars += yytext.length; }
. { yy.chars++; }
\n { yy.chars++; yy.lines++ }
/lex

%%
E : { console.log( yy.lines + "\t" + yy.words + "\t" + yy.chars); };


上面的代码在Jison's try page上使用Jison 0.4.13测试。

07-28 09:16