/*
Exemplu de program in limbajul IPP:
#include<stdio>
int main()
{
int a,b;
float c;
std::cin>>a>>b>>c;
std::cout<<"Variables: "<<a<<b<<c;
}
*/
/*
Setul de reguli al limbajului IPP:
E = E1+E2*E3E4mainE5E6E2E7E2(E8|E9|E10|E11)*E12
E1 = #include<[a-z]+>E2+
E2=\n
E3=int
E4=" "
E5=(
E6=)
E7={
E12=}
E13=,
E14=;
E8=E3E4[a-z]+(E13[a-z]+)*E14E2+
E9=E15E4(E13[a-z]+)+E14E2+
E10=E16E17{2}cin(E18{2}[a-z]*)+E14E2+
E11=E16E17{2}cout(E19{2}([a-z]*|(E20[a-zA-Z0-9 ]*E20)))+E14E2+
E15=float
E16=std
E17=:
E18=>
E19=<
E20="
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
void parseDiez(char **p)
{
if(**p == '#')
(*p)++;
}
void parseIncludeKeyWord(char **p)
{
char include[8];
int i = 0;
for(i = 0; i < 7; i++)
include[i] = *(*p+i);
if(strcmp(include, "include") !=0)
{
printf("Eroare: Dupa # nu urmeaza include");
exit(1);
}
(*p)+=strlen(include);
}
void parsespatiigoale(char **p)
{
while(**p==' ') (*p) ++;
}
void parsemaimic(char **p)
{
if(**p != '<')
{
printf("Eroare: Dupa numele bibliotecii nu urmeaza <");
exit(3);
}
(*p)++;
}
void parsemaimare(char **p)
{
if(**p != '>')
{
printf("Eroare: Dupa numele bibliotecii nu urmeaza >");
exit(3);
}
(*p)++;
}
void parseenter(char **p)
{
if(**p != '\n')
{
printf("Eroare: Dupa semnul > nu urmeza enter");
exit(4);
}
}
void parsenumebiblioteca(char **p)
{
while(**p>='a'&& **p<='z') (*p)++;
}
void parseInclude(char **p)
{
parseDiez(p);
parseIncludeKeyWord(p);
parsespatiigoale(p);
parsemaimic(p);
parsenumebiblioteca(p);
parsemaimare(p);
parseenter(p);
}
int main(void) {
char linie[60];
char * p = fgets(linie, 60, stdin);
char * p_backup = NULL;
char sep[] = ",";
p = strtok(linie, sep);
while(p)
{
if(*p == '#')
{
parseInclude(&p);
}
else if(strcmp(p,"\n") == 0)
{
p = fgets(linie, 60, stdin);
while(strcmp(p,"\n") == 0) {
p_backup = p;
p = fgets(linie, 60, stdin);
}
p = p_backup;
}
else if(strncmp(p,"int",3)==0)
{
p += strlen("int");
if(*p != ' ')
{
printf("Eroare: Dupa cuvantul cheie int nu urmeaza spatiu!");
exit(5);
}
p++;
if(strncmp(p,"main",4) == 0)
{
p+=strlen("main");
if(*p != '(')
{
printf("Eroare: Dupa cuvantul main nu urmeaza paranteza deschisa!");
exit(6);
}
p++;
if(*p != ')')
{
printf("Eroare: Dupa paranteza deschisa nu urmeaza paranteza inchisa!");
exit(7);
}
}
else
{
p = strtok(p,sep);
char * backup;
while(*p >= 'a' && *p <= 'z')
{
p++;
}
if((*p < 'a' || *p > 'z') && *p != ';' && *p != '\0')
{
printf("Eroare: Numele variabilei este compus si din alte caractere decat litere mici!");
exit(8);
}
backup = p;
p=strtok(NULL,sep);
while(p)
{
if(p)
{
while(*p >= 'a' && *p <= 'z')
{
p++;
}
if((*p < 'a' || *p > 'z') && *p != ';' && *p != '\0')
{
printf("Eroare: Numele variabilei este compus si din alte caractere decat litere mici!");
exit(9);
}
}
else
{
printf("Eroare: Lipseste numele variabilei int!");
exit(10);
}
p=strtok(NULL,sep);
}
p=backup;
while(*p >= 'a' && *p <= 'z') p++;
if((*p < 'a' || *p > 'z') && *p != ';')
{
printf("Eroare: Numele variabilei este compus si din alte caractere decat litere mici!");
exit(11);
}
if(strcmp(p,";\n") != 0)
{
printf("Eroare: Dupa ; nu urmeaza enter!");
exit(12);
}
}
}
else if(strncmp(p,"float",5) == 0)
{
p += strlen("float");
if(*p != ' ')
{
printf("Eroare: Dupa cuvantul cheie int nu urmeaza spatiu!");
exit(13);
}
p++;
p = strtok(p,sep);
char * backup;
while(*p >= 'a' && *p <= 'z')
{
p++;
}
if((*p < 'a' || *p > 'z') && *p != ';' && *p != '\0')
{
printf("Eroare: Numele variabilei este compus si din alte caractere decat litere mici!");
exit(14);
}
backup = p;
p=strtok(NULL,sep);
while(p)
{
if(p)
{
while(*p >= 'a' && *p <= 'z')
{
p++;
}
if((*p < 'a' || *p > 'z') && *p != ';' && *p != '\0')
{
printf("Eroare: Numele variabilei este compus si din alte caractere decat litere mici!");
exit(15);
}
}
else
{
printf("Eroare: Lipseste numele variabilei float!");
exit(16);
}
p=strtok(NULL,sep);
}
p=backup;
while(*p >= 'a' && *p <= 'z') p++;
if((*p < 'a' || *p > 'z') && *p != ';')
{
printf("Eroare: Numele variabilei este compus si din alte caractere decat litere mici!");
exit(17);
}
if(strcmp(p,";\n") != 0)
{
printf("Eroare: Dupa ; nu urmeaza enter!");
exit(18);
}
}
else if(strcmp(p,"{\n") == 0)
{
}
else if(strncmp(p, "std::cin", 8) == 0)
{
p+=strlen("std::cin");
while (p && *p == '>' && (p+1) && *(p+1) == '>')
{
p+=2;
char * backup = p;
while(*p >= 'a' && *p <= 'z') p++;
if(*p != '>' && *p != ';')
{
printf("Eroare: Numele variabilei nu este scris corect!");
exit(19);
}
if(p-backup == 0)
{
printf("Eroare: Dupa >> nu exista variabila sau nu este scrisa corect!");
exit(20);
}
}
if(strcmp(p, ";\n") != 0)
{
printf("Eroare: Lipseste ; la cin!");
exit(21);
}
}
else if(strncmp(p, "std::cout", 9) == 0)
{
p+=strlen("std::cout");
while (p && *p == '<' && (p+1) && *(p+1) == '<')
{
p+=2;
if(*p == '"')
{
p++;
while(*p >= 'a' && *p <= 'z' || *p >= 'A' && *p <= 'Z' || *p == ' ' || *p >= '0' && *p <= '9') p++;
if(*p != '"')
{
printf("Eroare: Nu sunt inchise ghilimelele la sirul de caractere sau acesta nu este scris corect!");
exit(22);
}
p++;
}
else
{
char * backup = p;
while(*p >= 'a' && *p <= 'z') p++;
if(*p != '<' && *p != ';')
{
printf("Eroare: Numele variabilei nu este scris corect!");
exit(23);
}
if(p-backup == 0)
{
printf("Eroare: Dupa << nu exista variabila sau nu este scrisa corect!");
exit(24);
}
}
}
if(strcmp(p, ";\n") != 0)
{
printf("Eroare: Lipseste ; la cout!");
exit(25);
}
}
else if(strcmp(p,"}\n") == 0)
{
}
if(p_backup)
{
p=p_backup;
}
else
{
p = fgets(linie, 60, stdin);
p_backup = NULL;
}
}
return 0;
}