python等缩进语言的词法分析实现

简介:

python等缩进语言的词法分析实现:

定义两个虚拟的Token:

tokens {
    INDENT;
    DEDENT;
}

还有一个缩进栈,用于确定是缩进一行,还是回退一行: 
Stack<Integer> _indentStack = new Stack<Integer>();

在开始做词法分析之前,压入一个默认的Indent,这一步其实没什么必要,只是用来避免写判断栈顶是否为空的冗余判断:
_indentStack = new Stack<Integer>();
_indentStack.push(new Integer(0));

针对每一个新行,首先判断行首是否是空格,如果是空格,则空格计1、Tab键计8个空格,如果仅仅是空行,跳过。如果在碰到行尾之前碰有非空字符,则将空格数与栈顶的空格对比,如果大于,压入当前行的空格数,并生成一个虚拟的Indent Token,如果小于,将所有空格数大于当前行的出栈,并生成一个虚拟的Dedent Token:

NEWLINE
@init {
    int spaces = 0;
}
    :   ((('\u000C')?('\r')? '\n' ) | '\t' | ' ')* (('\u000C')?('\r')? '\n')
        leading_space = (' ' { spaces++; } | '\t' { spaces += 8; spaces -= (spaces \% 8); })*
        {
            if ( !_inATable && 
                 (getCharPositionInLine() == 0 ||
                  implicitLineJoiningLevel > 0) ) {
                emit(new ClassicToken(NEWLINE, this.getText(), HIDDEN));
            } else {
                emit(new ClassicToken(NEWLINE, this.getText(), HIDDEN));
            }

            if ( implicitLineJoiningLevel == 0 && 
                 _indentStack.size() > 0) {
                if (spaces > _indentStack.peek().intValue() ) {
                    _indentStack.push(new Integer(spaces));                    
                    emit(new ClassicToken(INDENT, ">"));
                }
                else {
                    while ( spaces < _indentStack.peek().intValue() ) {
                        _indentStack.pop();
                        emit(new ClassicToken(DEDENT, "<"));
                    }
                }
            }
        }
    | ((('\u000C')?('\r')? '\n' ) | '\t' | ' ')* (('\u000C')?('\r')? '\n')
      (' ' | '\t')* '#' (~'\n')*
        {
            $channel = HIDDEN;
        }
    ;

当然还要考虑纯注释行,和空格后仅跟有注释的情形。

这样词法分析过程中,缩进的词法分析过程就完了,在语法分析中,Indent是透明的,例如:

compound_stmt
    : IF compound_condition (suite)+ elif_clause* else_clause? 
    | assignment
    ;

suite
    : INDENT (compound_stmt)+ (DEDENT | EOF)
    ;

上面的语法中,INDENT和DEDENT就跟括号的处理没什么区别,只不过DEDENT可选,主要是考虑直接在代码后就EOF的情况。



本文转自 donjuan 博客园博客,原文链接:  http://www.cnblogs.com/killmyday/archive/2012/08/19/2646719.html ,如需转载请自行联系原作者

相关文章
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
Python 语言的瑰宝:数据科学中的无限潜能
在当今数字化时代,数据科学的应用已成为推动企业和学术界前进的重要力量。而Python语言,作为一门简洁、灵活且功能强大的编程语言,正日益成为数据科学领域的首选工具。本文将探讨Python语言在数据科学中的广泛应用,从数据分析到机器学习,再到人工智能。
|
6月前
|
C语言 Python
Python基础分享之缩进和选择
Python基础分享之缩进和选择
|
7月前
|
机器学习/深度学习 数据可视化 数据挖掘
为什么Python是数据科学家的首选语言
为什么Python是数据科学家的首选语言
32 0
|
7月前
|
JavaScript 前端开发 Java
入门Python编程:了解计算机语言、Python介绍和开发环境搭建
入门Python编程:了解计算机语言、Python介绍和开发环境搭建
102 0
|
8月前
|
SQL 关系型数据库 数据库连接
【Python入门系列】第七篇:Python数据库操作和SQL语言
本文介绍了使用Python进行数据库操作的基本知识,包括连接数据库、执行SQL查询和更新操作等。同时,还介绍了SQL语言的基本语法和常用的查询语句。通过学习本文,读者将能够使用Python与各种类型的数据库进行交互,并掌握基本的SQL语言知识。
116 0
|
7天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
4月前
|
存储 Python
Python基础语法之注释、缩进、数字类型、一句多行和多行一句等的讲解及演示(超详细 附源码)
Python基础语法之注释、缩进、数字类型、一句多行和多行一句等的讲解及演示(超详细 附源码)
38 0
|
1月前
|
XML 数据采集 数据格式
Python语言的结构化标志语言处理
Python语言的结构化标志语言处理
|
1月前
|
IDE Java 开发工具
Python新手常见问题四:如何规避Python中的缩进错误?
在Python编程语言中,代码块的结构和逻辑是通过缩进来组织的,这与其他许多语言依赖花括号(如Java、C++)的方式大相径庭。对于初学者来说,正确理解和使用缩进规则至关重要,因为不恰当的缩进会导致IndentationError,从而影响程序的执行。本文将详细探讨Python缩进错误的常见场景,并提供有效的预防措施。
27 1
|
1月前
|
IDE Java 开发工具
Python中如何避免缩进错误讲解
Python中如何避免缩进错误讲解
31 1

热门文章

最新文章