int*_*tar 6 grammar indentation jison
有没有人有一个简单的例子,说明如何使用Jison定义一个解析类似python的缩进的语法?
我使用Jison创建了一种使用python样式缩进的语言.它是一种名为Bianca的自动化白盒算法测试语言.
Bianca只有两个依赖 - 一个是Jison,另一个是Lexer.Jison支持自定义扫描仪,Lexer就是这样一款扫描仪.
在C风格的编程语言中,代码块由花括号分隔.在python风格的缩进中,你有INDENT和DEDENT令牌.
在Lexer中编写生成INDENT和DEDENT令牌的规则很简单.事实上,Lexer文档准确地说明了如何做到这一点.
这段代码直接取自Bianca(lexer.js)的源代码:
var indent = [0];
lexer.addRule(/^ */gm, function (lexeme) {
var indentation = lexeme.length;
col += indentation;
if (indentation > indent[0]) {
indent.unshift(indentation);
return "INDENT";
}
var tokens = [];
while (indentation < indent[0]) {
tokens.push("DEDENT");
indent.shift();
}
if (tokens.length) return tokens;
});
Run Code Online (Sandbox Code Playgroud)
可以在Python文档中找到有关此代码如何工作的简要说明:
在读取文件的第一行之前,在堆栈上推送一个零; 这永远不会再被弹出.推到堆栈上的数字将始终从下到上严格增加.在每个逻辑行的开头,将行的缩进级别与堆栈的顶部进行比较.如果它是平等的,没有任何反应.如果它更大,则将其推入堆栈,并
INDENT生成一个令牌.如果它更小,它必须是堆栈中出现的数字之一; 弹出堆栈中较大的所有数字,并且对于弹出的每个数字,将DEDENT生成一个令牌.在文件的末尾,DEDENT为堆栈上剩余的大于零的每个数字生成一个令牌.