`
muyu
  • 浏览: 223311 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

语法分析函数

    博客分类:
  • php
 
阅读更多

如何完整地从一个文本中获取一个function函数块?

 

通过堆栈,辨别“{”、“}”出现的顺序、次数:

  1. 碰到“{”,push一下;碰到“}”,pop一次。
  2. 每次碰到“}”,都要判断一下堆栈是否已经为空了,如果为空,表示获取了完整的代码块。
  3. 注意考虑出现在单行注释、多行注释中的“{”、“}”。

 

函数实现如下:

 

/**
 * 返回函数体字符串
 *
 * @param string $blockStart
 * @param string $codeStr
 * @return string / false
 */
function getCodeBlock($blockStart, $codeStr) {
	$str = $codeStr;
	$pos = strpos($codeStr, $blockStart);
	if (false === $pos) {
		return false;
	}
	
	$len = strlen($str);
	$stack = array();
	$search = '';
	$commentSingle = false;
	$commentMultiline = false;
	for($i=$pos; $i<$len; $i++) {
	    $tmp = $str[$i];
	    $search .= $tmp;
	    //处理单行注释 //....
	    if (!$commentMultiline) {
	        if ($i>1 && "/" == $tmp && "/" == $str[$i-1]) {
	            $commentSingle = true;
	        }
	        if ($commentSingle && "\n" == $str[$i]) {
	            $commentSingle = false;
	        }
	    }
	
	    //处理多行注释  /*  ..   */
	    if ($i>1 && "*" == $tmp && "/" == $str[$i-1]) {
	        $commentMultiline = true;
	    }
	    if ($commentMultiline && "/" == $tmp && "*" == $str[$i-1]) {
	        $commentMultiline = false;
	    }
	    
	    //记录"{"、"}"
	    if (!$commentSingle && !$commentMultiline) {
	        if ('{' == $tmp) {
	            $stack[] = '{';
	        }
	        if ('}' == $tmp) {
	            array_pop($stack);
	            if (empty($stack)) {
	                break;
	            }
	        }
	    }
	}
	return $search;
}

 

 

---------------

引申

---------------

有了这个函数,可以做编辑器里常用的“format”---格式化代码---的功能。

如果考虑到语句结束符、缩进规则,可以解析源代码,然后再调用编译器了。

0
0
分享到:
评论

相关推荐

    C语言语法分析器源程序

    该程序主要由几个部分组成:语法分析器的数据结构、词法分析函数、语法分析函数和输出函数。 1. 数据结构 该程序定义了多个数据结构来存储和处理语法分析过程中的数据。这些数据结构包括: * token 结构体:用于...

    语法分析报告

    6. **语法分析源程序展示**:报告中还提供了部分语法分析源代码示例,展示了语法分析函数集的设计,每个函数用于分析特定的语法块,如常量声明、变量声明等,并通过返回值来指示语法分析的成功或失败。 #### 实验的...

    编译技术 语法分析实验报告

    4. **语法分析函数**: - `statement`函数处理语句结构,可能涉及条件语句、循环语句等。 - `expression`函数负责解析表达式,包括算术运算和比较。 - `term`函数处理乘除运算。 - `factor`函数处理加减运算或...

    语法分析实验报告和代码

    - **语法分析函数**:根据词法分析器提供的标记,执行解析操作。 - **非终结符和终结符的定义**:这些是文法的组成部分,非终结符代表更复杂的结构,终结符是基本的语法单位,如标识符、运算符或关键字。 - **状态...

    算术表达式的自上而下语法分析及其实现

    - **E-&gt;T-E** 的语法分析函数类似于上述函数,只需要将`if`语句中的`'+'`替换为`'-'`。 - **E-&gt;T** 的实现更为简单,仅调用`T_MulDiv()`函数即可。 通过合并这些产生式及其相应的函数,最终实现了对算术表达式...

    自顶向下的语法分析:递归下降法 编译原理

    2. **语法分析函数**: - `factor()`函数:负责分析一个因子,它可以是一个标识符、数字或者括号内的表达式。 - `term()`函数:负责分析一个术语,它由一个因子及可能跟在其后的乘除运算符和另一个因子组成。 - `...

    编译原理语法分析

    - **主函数 `main()`**:负责接收用户输入的一串字符,并调用词法分析函数 `scaner()` 和语法分析函数 `lrparser()` 来完成整个分析过程。 - **词法分析函数 `scaner()`**:用于将输入字符串分解成一个个有意义的...

    oracle分析函数及开窗函数

    通过本文的学习,我们了解了Oracle中的分析函数及其基本用法,包括常见的分析函数分类、基本语法以及实际应用场景。这些函数的强大之处在于它们能够轻松地处理复杂的数据计算需求,为数据分析提供了极大的便利。掌握...

    oracle分析函数

    分析函数的基本语法如下: ```sql FUNCTION_NAME(, ,…..) OVER (&lt;PARTITION clause&gt; &lt;ORDER clause&gt; ) ``` 其中,FUNCTION_NAME是分析函数(如SUM, AVG, ROW_NUMBER等),ARGUMENT是函数的参数,PARTITION BY用于...

    编译原理-语法分析

    在MFC环境中,我们可以通过消息驱动机制来处理用户的输入,例如,当用户在文本编辑器中键入代码时,可以实时调用语法分析函数,更新语法高亮显示。此外,MFC的框架结构可以帮助我们组织和管理复杂的编译器组件,如...

    《编译原理》语法分析

    主函数main虽然没有完全展示,但通常会包含读取输入文件,调用这些语法分析函数,以及输出最终的分析结果。 总结来说,这次实验旨在让学生深入理解编译器中语法分析的过程,通过实际操作,熟悉如何修改和构建语法...

    ORACLE分析函数

    #### 三、分析函数的基本语法 分析函数的基本语法结构如下: ``` FUNCTION_NAME(,) OVER (&lt;Partition-Clause&gt;&lt;Order-by-Clause&gt;) ``` 其中: - `FUNCTION_NAME`:指定要使用的分析函数名称。 - `&lt;argument&gt;`:...

    语法分析代码(C语言)

    在编程领域,语法分析是编译器设计的关键步骤之一,它负责将源代码转换成抽象语法树(AST),为后续的语义分析和代码生成奠定基础。本资源聚焦于使用C语言实现语法分析的代码,这通常是编译原理课程中的一个实践项目...

    语法分析器 tiny语言语法分析

    在编程领域,语法分析是编译器或解释器的核心组成部分,负责将源代码转换成抽象语法树(AST),这是理解程序结构的关键步骤。Tiny语言是一种简单的编程语言,用于教学或小型应用,其语法分析器的设计和实现对于学习...

    语法分析(C实现)

    在`语法分析.cpp`文件中,我们可能会看到类似以下的函数定义: ```c typedef enum { ID, INT_CONST, PLUS, MINUS, ... } Token; void expr(Token* token); void stmt(Token* token); ... ``` 每个函数会检查当前...

    分析函数详细解析

    - **语法结构相对复杂**:虽然能够简化查询,但分析函数本身的语法结构较复杂。 #### 二、分析函数语法说明 ##### 3.1 语法格式 分析函数的基本语法格式如下: ``` FUNCTION_NAME(,) OVER (&lt;Partition-Clause&gt;...

    编译原理 语法分析 语法树生成

    本主题主要关注的是“语法分析”和“语法树生成”,特别是如何使用经典的工具yacc(Yet Another Compiler-Compiler)和lex来实现C++语言的语法分析器。 首先,我们来了解一下什么是语法分析。语法分析是编译器设计...

    编译原理实验报告二 语法分析

    4. **语法分析函数**:每个函数都根据文法规则进行设计。 - 在`E_prime()`和`T_prime()`中,使用了`if`语句来判断当前符号是否为运算符,以此决定是否继续调用`T()`或`F()`。 - 在`F()`函数中,判断当前符号是否为...

Global site tag (gtag.js) - Google Analytics