如何完整地从一个文本中获取一个function函数块?
通过堆栈,辨别“{”、“}”出现的顺序、次数:
- 碰到“{”,push一下;碰到“}”,pop一次。
- 每次碰到“}”,都要判断一下堆栈是否已经为空了,如果为空,表示获取了完整的代码块。
- 注意考虑出现在单行注释、多行注释中的“{”、“}”。
函数实现如下:
/**
* 返回函数体字符串
*
* @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”---格式化代码---的功能。
如果考虑到语句结束符、缩进规则,可以解析源代码,然后再调用编译器了。
分享到:
相关推荐
该程序主要由几个部分组成:语法分析器的数据结构、词法分析函数、语法分析函数和输出函数。 1. 数据结构 该程序定义了多个数据结构来存储和处理语法分析过程中的数据。这些数据结构包括: * token 结构体:用于...
6. **语法分析源程序展示**:报告中还提供了部分语法分析源代码示例,展示了语法分析函数集的设计,每个函数用于分析特定的语法块,如常量声明、变量声明等,并通过返回值来指示语法分析的成功或失败。 #### 实验的...
4. **语法分析函数**: - `statement`函数处理语句结构,可能涉及条件语句、循环语句等。 - `expression`函数负责解析表达式,包括算术运算和比较。 - `term`函数处理乘除运算。 - `factor`函数处理加减运算或...
- **语法分析函数**:根据词法分析器提供的标记,执行解析操作。 - **非终结符和终结符的定义**:这些是文法的组成部分,非终结符代表更复杂的结构,终结符是基本的语法单位,如标识符、运算符或关键字。 - **状态...
- **E->T-E** 的语法分析函数类似于上述函数,只需要将`if`语句中的`'+'`替换为`'-'`。 - **E->T** 的实现更为简单,仅调用`T_MulDiv()`函数即可。 通过合并这些产生式及其相应的函数,最终实现了对算术表达式...
2. **语法分析函数**: - `factor()`函数:负责分析一个因子,它可以是一个标识符、数字或者括号内的表达式。 - `term()`函数:负责分析一个术语,它由一个因子及可能跟在其后的乘除运算符和另一个因子组成。 - `...
- **主函数 `main()`**:负责接收用户输入的一串字符,并调用词法分析函数 `scaner()` 和语法分析函数 `lrparser()` 来完成整个分析过程。 - **词法分析函数 `scaner()`**:用于将输入字符串分解成一个个有意义的...
通过本文的学习,我们了解了Oracle中的分析函数及其基本用法,包括常见的分析函数分类、基本语法以及实际应用场景。这些函数的强大之处在于它们能够轻松地处理复杂的数据计算需求,为数据分析提供了极大的便利。掌握...
分析函数的基本语法如下: ```sql FUNCTION_NAME(, ,…..) OVER (<PARTITION clause> <ORDER clause> ) ``` 其中,FUNCTION_NAME是分析函数(如SUM, AVG, ROW_NUMBER等),ARGUMENT是函数的参数,PARTITION BY用于...
在MFC环境中,我们可以通过消息驱动机制来处理用户的输入,例如,当用户在文本编辑器中键入代码时,可以实时调用语法分析函数,更新语法高亮显示。此外,MFC的框架结构可以帮助我们组织和管理复杂的编译器组件,如...
主函数main虽然没有完全展示,但通常会包含读取输入文件,调用这些语法分析函数,以及输出最终的分析结果。 总结来说,这次实验旨在让学生深入理解编译器中语法分析的过程,通过实际操作,熟悉如何修改和构建语法...
#### 三、分析函数的基本语法 分析函数的基本语法结构如下: ``` FUNCTION_NAME(,) OVER (<Partition-Clause><Order-by-Clause>) ``` 其中: - `FUNCTION_NAME`:指定要使用的分析函数名称。 - `<argument>`:...
在编程领域,语法分析是编译器设计的关键步骤之一,它负责将源代码转换成抽象语法树(AST),为后续的语义分析和代码生成奠定基础。本资源聚焦于使用C语言实现语法分析的代码,这通常是编译原理课程中的一个实践项目...
在编程领域,语法分析是编译器或解释器的核心组成部分,负责将源代码转换成抽象语法树(AST),这是理解程序结构的关键步骤。Tiny语言是一种简单的编程语言,用于教学或小型应用,其语法分析器的设计和实现对于学习...
在`语法分析.cpp`文件中,我们可能会看到类似以下的函数定义: ```c typedef enum { ID, INT_CONST, PLUS, MINUS, ... } Token; void expr(Token* token); void stmt(Token* token); ... ``` 每个函数会检查当前...
- **语法结构相对复杂**:虽然能够简化查询,但分析函数本身的语法结构较复杂。 #### 二、分析函数语法说明 ##### 3.1 语法格式 分析函数的基本语法格式如下: ``` FUNCTION_NAME(,) OVER (<Partition-Clause>...
本主题主要关注的是“语法分析”和“语法树生成”,特别是如何使用经典的工具yacc(Yet Another Compiler-Compiler)和lex来实现C++语言的语法分析器。 首先,我们来了解一下什么是语法分析。语法分析是编译器设计...
4. **语法分析函数**:每个函数都根据文法规则进行设计。 - 在`E_prime()`和`T_prime()`中,使用了`if`语句来判断当前符号是否为运算符,以此决定是否继续调用`T()`或`F()`。 - 在`F()`函数中,判断当前符号是否为...