有没有人有一个简单的例子,说明如何使用Jison定义一个语法来解析块的类似python的缩进?
发布于 2013-04-05 11:23:59
我用Jison创建了一种语言,它使用python-style indentation。它是一种名为Bianca的自动化白盒算法测试语言。
Bianca只有两个依赖项--一个是Jison,另一个是Lexer。Jison支持custom scanners,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;
});在Python文档中可以找到有关此代码工作原理的简要说明:
在读取文件的第一行之前,在堆栈上压入一个零;这将永远不会再次弹出。推送到堆栈上的数字将始终严格地从下到上递增。在每个逻辑行的开头,将行的缩进级别与堆栈的顶部进行比较。如果相等,则不会发生任何事情。如果它较大,则将其推送到堆栈上,并生成一个
INDENT令牌。如果它较小,则它必须是堆栈上出现的数字之一;堆栈上所有较大的数字都将被弹出,并为每个从堆栈中弹出的数字生成一个DEDENT标记。在文件的末尾,将为堆栈中剩余的每个大于零的数字生成一个DEDENT标记。
https://stackoverflow.com/questions/14803043
复制相似问题