Tag: 解析

如何手工编写(shell)词法分析器

我正在研究一个shell,一个像bash一样的小shell,没有脚本(如果……)我必须手工制作词法分析器/解析器(LL)。 因此词法分析器会将命令( char * cmd )转换为链表( t_list * list )。 LL解析器将链接列表( t_list * list )转换为带有语法的AST(二叉树t_btree * root ) 所以,我知道如何制作LL解析器,但我不知道如何标记我的命令。 例如: ps | grep ls >> file ; make && ./a.out ps | grep ls >> file ; make && ./a.out > ‘ps’ ‘|’ ‘grep’ ‘ls’ ‘>>’ ‘file’ ‘;’ ”make ‘&&’ ‘./a.out’ ‘ps’ ‘|’ ‘grep’ ‘ls’ […]

数学表达式的自定义解释器

我必须评估包含变量的大量表达式,我正在考虑编写一个小的自定义解释器来保持编译的快速和小。 但是我对这个主题没有经验并且有一些问题。 假设我们有一个包含数学表达式和一组有限对象的文件。 该文件可能如下所示: expr[x,y,z] = 2*x*y + x^2 + 28/14*z*(x*y^2 + 15*z) + … 我想以某种方式解析它,所以我可以通过简单地调用函数expr(float x, float y, float z)在我的应用程序中以数字方式计算表达式。 不应修复参数的数量(编辑:每个表达式都有自己的定义,带有适当数量的参数或接受数组)并且应该允许嵌套括号以使输入文件保持相当小。 由于表达式都是多项式类型,我可以想一想数据结构应该是什么样子,但解析看起来很困难。 我已经在SO上找到了一些类似问题的答案,例如使用Lua。 然而,最大的问题是,与直接从自动生成的C代码编译这些表达式相比,创建和调用这些对象时的性能损失是什么。 提前致谢! 编辑:请仅考虑上面的expr()示例。 我想最好的方法是让模板类的对象保存稀疏数组中变量的系数和幂。

如何将三元运算符合并到优先攀爬算法中?

我按照本网页 “优先攀登”部分给出的解释,使用带有各种一元前缀和二进制中缀运算符的优先攀爬算法来实现算术评估器。 我还想包括三元运算符(即三元条件运算符?: :)。 网页上给出的算法使用以下语法: E –> Exp(0) Exp(p) –> P {B Exp(q)} P –> U Exp(q) | “(” E “)” | v B –> “+” | “-” | “*” |”/” | “^” | “||” | “&&” | “=” U –> “-” 如何将三元运算符合并到这个语法中?

在C或C ++中是否有轻量级的multipart / form-data解析器?

我正在考虑在Web服务器模块中集成多部分表单数据解析,这样我就可以解除后端Web应用程序(通常用动态语言编写)来解析多部分数据本身。 多部分语法(RFC 2046)看起来并不重要,如果我手动实现它,很多事情都可能出错。 是否已经有一个用C或C ++编写的好的,轻量级的multipart / form-data解析器? 我正在寻找一个除了C或C ++标准库之外没有外部依赖关系的人。 我不需要电子邮件附件处理或缓冲的I / O类或可移植运行时或其他任何东西,只需要多部分/表单数据解析。 我考虑过的事情: GMime – 取决于滑稽,所以不要去。 libapreq – 太大,取决于APR,记录严重,没有unit testing。 我也看过用Ragel编写一个解析器,但我无法弄清楚如何做到这一点,因为语法不是静态的:边界可以任意改变。

解析mmap() – ed文件

什么是解析mmap-ed文件的最佳(最快)方法? 它包含数据对(字符串int),但我不能在它们之间使用空格/制表符/换行符。

在C中将文件读取到2D数组

我正在学习C,我决定将文字游戏作为我的学习项目 。 所以我正在尝试这种将文本文件读入2D数组的原始“解析器”,但是存在一个问题:这个地图不使用1个字符宽的单元格,它使用2个字符宽的单元格。 例如,播放**表示,门用##表示,依此类推。 这意味着,我需要读取文本文件的2个字符,然后将其分配给地图中的相应单元格。 好吧,我制作了一个包含的测试文件 aabbccddee ffgghhiijj kkllmmnnoo ppqqrrsstt uuvvwwxxyy 我试着用它读 #include #define ROWS 5 #define COLS 5 int main() { FILE *mapfile = fopen(“durr”, “r”); char charbuffer[3], row, col, *map[ROWS][COLS]; /* Initializing array */ for (row = 0; row < ROWS; row++) { for (col = 0; col < COLS; col++) { map[row][col] […]

计算字符串中的单词?

你好这个程序我应该计算一个字符串中的单词数。 到目前为止,我已经找到了如何找到一个字符串中的字符数,但我无法弄清楚如何翻转一个单词的字母,并将其计为一个单词。 我的function是: int wordcount( char word[MAX] ){ int i, num, counter, j; num = strlen( word ); counter = 0; for (i = 0; i < num; i++) { if (word[i] != ' ' || word[i] != '\t' || word[i] != '\v' || word[i] != '\f') { } } return counter; } 我尝试了一些变化,但if语句的中间部分是我感到困惑的地方。 如何计算字符串中的单词数? […]

如何解决2 + 2和2 ++ 2冲突

在较大的程序中,我给出了以下(flex / bison) 在flex中: pn [\+|\-] dig [0-9]+ exp [e|E]{dig}+ 。 。 。 “+” {printf(“+ detected\n”); return PLUS_SIGN;} {pn}?{dig}+ { printf(“digit detected – %s\n”,yytext); sscanf(yytext, “%d”, (int*)&yylval); return TYPE_INT;} 在野牛: expr: expr PLUS_SIGN expr { $$ = $1 + $3; printf(” $$=%f\n”,$$); } | TYPE_INT { $$ = (int)$1; printf(” $$=%f\n”,$$); } ; 问题是: 当我给2 […]

替换字符串

我正在做像excel这样的事情,我有这样的事情: 1 2 3 A1 B1 C1 它替换指定内容的内容,其中A1替换1的内容.B1替换2 …等的内容… 我正在使用多维数组,我做这样的事情: int offset = 0, readCharCount; while(sscanf(matris[i][c] + offset, “%c%d%*c%n”, &col, &linha, &readCharCount) == 2){ //printf(“%c, %d\n”, col, linha); //strcpy(matris[i][c], matris[linha-1][col – ‘A’]); offset += readCharCount; //printf(” {%c, %d}”, col, linha); //printf(“\n”); } 但是当我有A1 + B1 + C1和其他东西时,我不能替换总内容,因为其他参考将被删除…. 所以,在单元格,A1 + B1 + C1,我想改变B1指定的内容….我想这样: This -> A1+B1+C1 […]

使用C / C ++有效地反序列化由浮点数,标记和空行组成的字符串

我有大字符串,类似于以下… some_text_token 24.325973 -20.638823 -1.964366 0.753947 -1.290811 -3.547422 0.813014 -3.547227 0.472015 3.723311 -0.719116 3.676793 other_text_token 24.325973 20.638823 -1.964366 0.753947 -1.290811 -3.547422 -1.996611 -2.877422 0.813014 -3.547227 1.632365 2.083673 0.472015 3.723311 -0.719116 3.676793 … …我正在尝试有效地,并且在交错的序列中,它们出现在字符串中,抓住…… 文本标记 浮动值 空白行 ……但我遇到了麻烦。 我已经尝试过strtod并成功地从字符串中抓取了浮点数,但我似乎无法使用strtod来向我报告交错的文本标记和空白行。 我不是100%自信strtod是“正确的轨道”给出交错的令牌和空白行,我也感兴趣。 字符串中存在标记和空行以给浮点数提供上下文,因此我的程序知道每个标记之后要使用的浮点值是什么,但是strtod似乎更适合于报告它遇到的浮点数。一个字符串,不考虑空白行或代币等愚蠢的东西。 我知道这在概念上并不是很难,但对C / C ++来说相对较新我无法判断我应该关注哪些语言function,以充分利用C / C ++可以带来的效率来解决这个问题。 有什么指针吗? 我非常感兴趣为什么各种方法的function或多或少都有效。 谢谢!!!