首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找使用块结构缩进的Jison语法的示例

查找使用块结构缩进的Jison语法的示例
EN

Stack Overflow用户
提问于 2013-02-11 05:55:54
回答 1查看 2K关注 0票数 6

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-05 11:23:59

我用Jison创建了一种语言,它使用python-style indentation。它是一种名为Bianca的自动化白盒算法测试语言。

Bianca只有两个依赖项--一个是Jison,另一个是Lexer。Jison支持custom scanners,Lexer就是这样的一个扫描器。

在C风格的编程语言中,代码块由大括号分隔。但是,在python样式的缩进中,有INDENTDEDENT标记。

在Lexer中编写生成INDENTDEDENT标记的规则非常简单。事实上,Lexer文档准确地说明了如何做到这一点。

这段代码直接取自Bianca (lexer.js)的源代码:

代码语言:javascript
复制
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标记。

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

https://stackoverflow.com/questions/14803043

复制
相关文章

相似问题

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