コンパイラ実践3の算術式に対する文法分析器
この算術式の文脈に関係のない文法は次のとおりです.
E -> E + T
| E - T
| T
T -> T * F
| T/F
| F
F -> num
| (E)
一部のコードはMOOCから
君と励まし合う
E -> E + T
| E - T
| T
T -> T * F
| T/F
| F
F -> num
| (E)
一部のコードはMOOCから
#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:
%s
", str);
int j = i;
while (j--)
fprintf (stderr, " ");
fprintf (stderr, "^
");
fprintf (stderr, "Syntax error at position: %d
"
"\texpecting: %s
"
"\tbut got : %c
",
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 (char 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;
}
君と励まし合う