Regular expressions do not have a no negation operator.
In Flex, ^ can occur as the first character inside brackets. It only takes the complement of a set of characters. It means "any single character except these."
When ^ occurs outside brackets, it only matches if the next character is at the beginning of a line.
Square brackets are only used to describe a set of characters. [aaa] matches one a. It is just a redundant specification of set {a}.
In Flex, a dot matches any character except newline. To match any character at all, you can use (.|"\n").
$ is not the same as "\n". $ matches at the end of a line, but it does not match the newline character.
If you define a regular expression, then you must put braces around the name where you use it.
The problem about comments of the form /*...*/ is difficult, and nobody got it. I will show you how to find that regular expression later, when I have time to write it up.
A few students wrote aaa for the answer to question 1(a) (strings that contain exactly 3 a's and no newlines). A correct answer is
[^a\n]*a[^a\n]*a[^a\n]*a[^a\n]*or, more succinctly
([^a\n]*a){3}[^a\n]*
The action done by Flex for a regular expression must start on the same line as the regular expression.
Any time you submit a program to me, indent it correctly. I promise that I will take off points for poorly indented programs.
If you are going to use Flex to solve a problem, then let Flex do what it is good at rather than taking a more difficult approach. Here is a solution to problem 3.
{% # include%} vowel [aeiouAEIOU] letter [a-zA-Z] %% {vowel}{letter}* {printf("%say", yytext); } {letter}+ {printf("%s%cay", yytext+1, yytext[0]); } (.|"\n") {printf("%s", yytext); } %% int main() { yyin = stdin; yylex(); return 0; } int yywrap(void) { return 1; }