Compiler construction 吉森全局变量

Compiler construction 吉森全局变量,compiler-construction,flex-lexer,jison,Compiler Construction,Flex Lexer,Jison,在以前版本的Jison中,可能有一个类似Flex的特性,允许定义在lexer和parser上下文中都可以访问的变量,例如: %{ 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 : { cons

在以前版本的Jison中,可能有一个类似Flex的特性,允许定义在lexer和parser上下文中都可以访问的变量,例如:

%{
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) ; };
参考:

尽管在最新版本的Jison中,这是无效的<无法从解析器上下文访问code>chars、
单词
,从而生成错误

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


全球定义目前在Jison中是如何工作的?

当前版本的Jison有一个通用定义,其目的是允许在词汇操作、语义操作和其他模块之间共享数据。如果将所有这些变量存储在
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 0.4.13进行测试的。

作为建议,而不是在“if”中使用“chars”,您应该使用一个变量,而不是使用它,例如“cities”。同样的事情也发生在我的连接问题上,但我解决了它

如果(!('chars'在yy中)){ yy.cities=[“奥斯汀”、“纽约”、“芝加哥”、“拉斯维加斯”]

=>

如果(!(‘城市’在yy中)){
yy.cities=[“奥斯汀”、“纽约”、“芝加哥”、“拉斯维加斯”];

对于多个表达式,此全局变量的初始化对于每个其他E都不同。在这种情况下,如果我想通过将字符串合并来存储值,则它不起作用。如果您可以建议我必须进行哪些更改,以便我的变量
$x
可以存储所有E中的所有值,请参阅我的语法。