summaryrefslogtreecommitdiff
path: root/examples/manual/front.y
diff options
context:
space:
mode:
Diffstat (limited to 'examples/manual/front.y')
-rw-r--r--examples/manual/front.y118
1 files changed, 118 insertions, 0 deletions
diff --git a/examples/manual/front.y b/examples/manual/front.y
new file mode 100644
index 0000000..77b5ca1
--- /dev/null
+++ b/examples/manual/front.y
@@ -0,0 +1,118 @@
+/* C code supplied at the beginning of the file. */
+
+%{
+
+#include <stdio.h>
+#include <string.h>
+
+extern int yylexlinenum; /* these are in YYlex */
+extern char *yytext; /* current token */
+
+
+%}
+
+/* Keywords and reserved words begin here. */
+
+%union{ /* this is the data union */
+ char name[128]; /* names */
+}
+
+/*-------------------- the reserved words -----------------------------*/
+
+%token PERIOD
+%token NEWLINE
+%token POSITIONAL
+
+%token VERB
+%token ADVERB
+
+%token PROPER_NOUN
+%token NOUN
+
+%token DECLARATIVE
+%token CONDITIONAL
+
+
+%type <name> declarative
+%type <name> verb_phrase
+%type <name> noun_phrase
+%type <name> position_phrase
+%type <name> adverb
+
+%type <name> POSITIONAL VERB ADVERB PROPER_NOUN
+%type <name> NOUN DECLARATIVE CONDITIONAL
+
+%%
+
+sentence_list : sentence
+ | sentence_list NEWLINE sentence
+ ;
+
+
+sentence : verb_phrase noun_phrase position_phrase adverb period
+ {
+ printf("I understand that sentence.\n");
+ printf("VP = %s \n",$1);
+ printf("NP = %s \n",$2);
+ printf("PP = %s \n",$3);
+ printf("AD = %s \n",$4);
+ }
+ | { yyerror("That's a strange sentence !!"); }
+ ;
+
+position_phrase : POSITIONAL declarative PROPER_NOUN
+ {
+ sprintf($$,"%s %s %s",$1,$2,$3);
+ }
+ | /* empty */ { strcpy($$,""); }
+ ;
+
+
+verb_phrase : VERB { strcpy($$,$1); strcat($$," "); }
+ | adverb VERB
+ {
+ sprintf($$,"%s %s",$1,$2);
+ }
+ ;
+
+adverb : ADVERB { strcpy($$,$1); }
+ | /* empty */ { strcpy($$,""); }
+ ;
+
+noun_phrase : DECLARATIVE NOUN
+ {
+ sprintf($$,"%s %s",$1,$2);
+ }
+ | CONDITIONAL declarative NOUN
+ {
+ sprintf($$,"%s %s %s",$1,$2,$3);
+ }
+ | NOUN { strcpy($$,$1); strcat($$," "); }
+ ;
+
+declarative : DECLARATIVE { strcpy($$,$1); }
+ | /* empty */ { strcpy($$,""); }
+ ;
+
+period : /* empty */
+ | PERIOD
+ ;
+
+
+%%
+
+/* Supplied main() and yyerror() functions. */
+
+int main(int argc, char *argv[])
+{
+ yyparse(); /* parse the file */
+ return(0);
+}
+
+int yyerror(char *message)
+{
+ extern FILE *yyout;
+
+ fprintf(yyout,"\nError at line %5d. (%s) \n",
+ yylexlinenum,message);
+}