首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jison全局变量

Jison全局变量
EN

Stack Overflow用户
提问于 2015-05-31 20:06:36
回答 2查看 1.1K关注 0票数 10

在Jison的早期版本中,有可能有类似Flex的特性,它允许在lexer和解析器上下文中都可以访问变量,例如:

代码语言:javascript
复制
%{
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的最新版本中,这是无效的。无法从解析器上下文中找到charswordslines,从而产生错误。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-13 03:47:54

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

代码语言:javascript
复制
%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的试页上使用Jison0.4.13进行了测试。

票数 10
EN

Stack Overflow用户

发布于 2021-06-13 09:22:50

作为对戈文德·曼特里的建议,不要在“if”中使用“chars”,而应该使用变量,而不是使用“城市”。同样的事情发生在我的级联问题上,但我解决了它。

如果(!('chars‘在yy)) { yy.cities =“奥斯汀”,"New_York",“芝加哥”,"Las_Vegas";

=>

如果(!(‘城市’在yy)) { yy.cities =“奥斯汀”,"New_York",“芝加哥”,"Las_Vegas";

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30562134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档