编译器构造- Jison全局变量



在以前的Jison版本中,有可能有一个类似flex的特性,允许定义在词法分析器和解析器上下文中都可以访问的变量,例如:

%{
var chars = 0;
var words = 0;
var lines = 0;
%}
%lex
%options flex
%%
s
[^ tnrfv]+ { words++; chars+= yytext.length; }
. { chars++; }
n { chars++; lines++ }
/lex
%%
E : { console.log(lines + "t" + words + "t" + chars) ; };

Ref。: Flex类功能?

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

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

全局定义目前在json中是如何工作的?

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

%lex
%options flex
%{
if (!('chars' in yy)) {
  yy.chars = 0;
  yy.words = 0;
  yy.lines = 1;
}
%}
%%
[^ tnrfv]+ { 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 0.4.13在Jison的try页面上测试的。

作为对Govind Mantri的建议,与其在'if'中使用'chars',不如在'if'中使用变量,例如'cities'。同样的问题也发生在我身上,但我解决了它。

如果(

!('chars' in yy)) {yy。城市= ["Austin" New_York" Chicago" Las_Vegas"];

=比;如果(

!('cities' in yy)) {yy。城市=["Austin","New_York","Chicago","Las_Vegas"];

相关内容

  • 没有找到相关文章

最新更新