c - C中的递归下降解析器
问题描述
我有以下生产规则
E -> (EX)|Y
X -> vE|^E|>E
Y -> -E|p|q|r
我有以下代码
int i;
int j;
int count;
char l;
void match(char t);
void E();
void X();
void Y();
void match(char t)
{
if (l == t) {
count += 1;
}
else{
printf("Error");
}
}
void E()
{
if(l == '('){
match('(');
E();
X();
if(l == ')'){
match(')');
return;
}
}
else{
Y();
}
return;
}
void Y()
{
if(l == '-'){
match('-');
E();
}
else if(l == 'p'){
match('p');
return;
}
else if(l == 'q'){
match('q');
return;
}
else if(l == 'r'){
match('r');
return;
}
}
void X()
{
if(l == 'v'){
match('v');
E();
}
else if(l == '^'){
match('^');
E();
}
else if(l == '>'){
match('>');
E();
}
return;
}
int parse(char* g){
count = 0;
//int k = strlen(g);
l = g[count];
//sprintf("%c",l);
E();
if(l == '$'){
printf("Parsing successful");
return 1;
}
else{
printf("Parsing unsuccessful");
return 0;
}
}
这似乎不起作用。该程序在没有打印任何内容的情况下崩溃。代码中的问题是什么?代码最初运行但没有任何反应,然后程序就退出了。我不认为有分段错误,但有人可以建议和帮助
解决方案
您的代码永远不会更新l
。l
如果我正确理解您的代码,您match
至少需要更新:
void match(char t)
{
if (l == t) {
count += 1;
l = g[count];
}
else {
printf("Error");
}
}
为此,您需要使g
global` (或者,理想情况下,您将删除所有全局变量并将解析器的状态封装到您传递给解析函数的结构中)。
推荐阅读
- python - 通过数组的路径组合
- mysql - 如果为空数据Mysql,则按日期分组返回0
- mysql - Rails 在 has_many 中创建数据:通过关系
- python - 搜索python对象层次结构
- python-3.x - 如何使用 Python 根据元数据文件对图像文件进行排序?
- spring - 使用配置为基于 UI 的路由的网关的简单 spring-boot 抛出 404
- docker - Visual Studio 2019 Docker - 手动创建的 .net core 3.1 容器未在浏览器中打开
- terraform - terraform 无法重命名多个 aws 资源
- python - 无论如何限制模块中的方法在python中导入?
- typescript - 如何使用 agSelectCellEditor 获取来自 Angular Grid 中数据库的下拉值