寻找使用缩进块结构的Jison语法的例子

int*_*tar 6 grammar indentation jison

有没有人有一个简单的例子,说明如何使用Jison定义一个解析类似python的缩进的语法?

Aad*_*hah 7

我使用Jison创建了一种使用python样式缩进的语言.它是一种名为Bianca的自动化白盒算法测试语言.

Bianca只有两个依赖 - 一个是Jison,另一个是Lexer.Jison支持自定义扫描仪,Lexer就是这样一款扫描仪.

在C风格的编程语言中,代码块由花括号分隔.在python风格的缩进中,你有INDENTDEDENT令牌.

在Lexer中编写生成INDENTDEDENT令牌的规则很简单.事实上,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为堆栈上剩余的大于零的每个数字生成一个令牌.