I wrote a parser for Roman numerals, and it seems to work for whatever numbers I throw at it. However, there are two things I don't like: a bunch of s/r conflicts, and the double recursion "number number".
Anyone know a way to keep it concise but avoid the warnings and inefficiency? Parser ====== %{ #include <stdio.h> int yyerror(const char *s); int yylex(void); %} %token I V X L C D M %% result : number { printf("%d\n", $1); } number : subtracter | number number { $$ = $1 + $2; } | numeral ; subtracter : I V { $$ = $2 - $1; } | I X { $$ = $2 - $1; } | X L { $$ = $2 - $1; } | X C { $$ = $2 - $1; } | C M { $$ = $2 - $1; } numeral : I | V | X | L | C | D | M; Scanner ======= %{ #include "roman.tab.h" extern int yylval; %} %% I { yylval = 1; return I; } V { yylval = 5; return V; } X { yylval = 10; return X; } L { yylval = 50; return L; } C { yylval = 100; return C; } D { yylval = 500; return D; } M { yylval = 1000; return M; } \n ; . { return *yytext; }