您的位置:首页 > 其它

语法分析(6)...

2016-05-14 19:09 295 查看
这两天都没更, 主要是马上要连着要考三门(16, 18, 20), 都没时间学编译器了, 等过了这段时间应该能有很多时间来搞这个, 之后我准备先把之前写的那个词法分析器生成器改造一下, 弄个最简版的正则引擎出来玩玩, 不过这些都是后话了, 今天似乎也没什么时间, 也就把这单元的作业写了一下... 代码比较简单就不多做解释了...

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

void parse_F();
void parse_T();
void parse_E();
void error (char *want, char got);

int i;
char *str = 0;

void error (char *want, char got)
{
fprintf (stderr, "Compling this expression:\n%s\n", str);
int j = i;
while (j--)
fprintf (stderr, " ");
fprintf (stderr, "^\n");
fprintf (stderr, "Syntax error at position: %d\n"
"\texpecting: %s\n"
"\tbut got  : %c\n",
i, want, got);
exit (0);
return;
}

void parse_F()
{
char c = str[i];
if (isdigit(c)){
i++;
return;
}
if (c=='('){
i++;
parse_E();
c = str[i];
if (c==')'){
i++;
return;
}
error ("\')\'", c);
return;
}
error ("\'0-9\' or \'(\'", c);
return;
}

void parse_T()
{
parse_F();
char c = str[i];
while (c=='*' || c == '/'){
i++;
parse_F();
c = str[i];
}
return;
}

void parse_E()
{
parse_T();
char c = str[i];
while (c =='+' || c == '-'){
i++;
parse_T();
c = str[i];
}
return;
}

void parse (char *e)
{
str = e;
i = 0;
parse_E();
if (str[i]=='\0')
return;
error ("\'+\' or '\\0\'", str[i]);
return;
}
///////////////////////////////////////////////
// Your job:
// Add some code into the function parse_E() and
// parse_T to parse "-" and "/" correctly.
// When you finish your task, NO error message
// should be generated.
// Enjoy! :-P
int main (int argc, char **argv)
{
// There are the following rules on an expression:
//   1. Every expression is represented as a string;
//   2. integers are non-negative;
//   3. integers are between 0-9.
char *e;

e = "(2)";
parse(e);

e = "(3+4*5))";
parse(e);

e = "(8-2)*3";
parse(e);

e = "(8-2)/3";
parse(e);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: