在Jison的早期版本中,有可能有类似Flex的特性,它允许在lexer和解析器上下文中都可以访问变量,例如:
%{
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的最新版本中,这是无效的。无法从解析器上下文中找到chars、words和lines,从而产生错误。
通过搜索更多关于新版本的信息,我发现在%{ ... %}内部通过在解析器的上下文中定义输出是可能的,但是它不起作用,尽管它被用于多行语句。我正在从源代码生成代码到目标语言,我将美化这段代码,应用由作用域控制的正确缩进,并直接从解析器生成代码,而无需构建AST。
当前Jison中的全局定义是如何工作的?
发布于 2015-08-13 03:47:54
当前版本的Jison有一个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的试页上使用Jison0.4.13进行了测试。
发布于 2021-06-13 09:22:50
作为对戈文德·曼特里的建议,不要在“if”中使用“chars”,而应该使用变量,而不是使用“城市”。同样的事情发生在我的级联问题上,但我解决了它。
如果(!('chars‘在yy)) { yy.cities =“奥斯汀”,"New_York",“芝加哥”,"Las_Vegas";
=>
如果(!(‘城市’在yy)) { yy.cities =“奥斯汀”,"New_York",“芝加哥”,"Las_Vegas";
https://stackoverflow.com/questions/30562134
复制相似问题