2016-04-17 6 views
1

Ich bin ein YACC Programm schreiben, das CFG für Vokale in dem gegebenen String definiert, ist mein Code Versuch wie folgtVokale kontextfreie Grammatik Definition YACC

%{ 
#include <stdio.h> 
%} 

%union{ 
    char c; 
} 

%token <c> VOW 

%% 
cha : 'a' { printf("a\n"); } 
    | 'e' {printf("e\n");} 
    | 'i' {printf("i\n");} 
    | 'o' {printf("o\n");} 
    | 'u' {printf("u\n");} 
    ; 
%% 

int main(void) {return yyparse();} 
int yylex(void) {return getchar();} 
void yyerror(char *s) {fprintf(stderr, "%s\n",s);} 

Ist dies eine korrekte Definition einer CFG für Vokale

+0

Es hängt davon ab, was genau Sie meinen. Du hast "Vokale" gesagt, und dies ist eine CFG für eine Sprache, in der ein gesetzlicher Satz aus einem einzelnen Vokal besteht, aber wenn ich dies durchführe, würde ich eine genauere Definition wünschen. – EJP

+0

Ich versuche, eine Zeichenfolge durch diese zu analysieren und nach den Vokalen zu suchen – 0xtvarun

+1

Sie scheinen zu missverstehen, was eine CFG ist - CFGs stimmen ganze Zeichenfolgen, nicht Teile einer Zeichenfolge überein, und beschreiben eine Sprache der Zeichenfolgen. Möchten Sie "alle Zeichenfolgen, die Vokale enthalten" oder "alle Zeichenfolgen, die nur Vokale enthalten"? Beides ist viel einfacher mit einem einfachen regulären Ausdruck als mit yacc. –

Antwort

1

Sie benötigen keine kontextfreie Grammatik für Ihr Problem, nur einen regulären Ausdruck. Sie verwenden das falsche Werkzeug für den Job. Es ist drei Linien in flex (1):

%% 
[aeiou] printf("%\n", yytext); 
.|\n ; 
Verwandte Themen