summaryrefslogtreecommitdiff
path: root/examples/manual/string2.lex
diff options
context:
space:
mode:
Diffstat (limited to 'examples/manual/string2.lex')
-rw-r--r--examples/manual/string2.lex94
1 files changed, 94 insertions, 0 deletions
diff --git a/examples/manual/string2.lex b/examples/manual/string2.lex
new file mode 100644
index 0000000..2c9d35f
--- /dev/null
+++ b/examples/manual/string2.lex
@@ -0,0 +1,94 @@
+/*
+ * string2.lex: An example of using scanning strings
+ * by using start states.
+ */
+
+%{
+#include <ctype.h>
+#include <malloc.h>
+
+#define isodigit(x) ((x) >= '0' && (x) <= '7')
+#define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10)
+
+char *buffer = NULL;
+int buffer_size = 0;
+
+void yyerror(char *message)
+{
+ printf("\nError: %s\n",message);
+}
+
+%}
+
+%x STRING
+
+hex (x|X)[0-9a-fA-F]{1,2}
+oct [0-7]{1,3}
+
+%%
+
+\" {
+ buffer = malloc(1);
+ buffer_size = 1; strcpy(buffer,"");
+ BEGIN(STRING);
+ }
+<STRING>\n {
+ yyerror("Unterminated string");
+ free(buffer);
+ BEGIN(INITIAL);
+ }
+<STRING><<EOF>> {
+ yyerror("EOF in string");
+ free(buffer);
+ BEGIN(INITIAL);
+ }
+<STRING>[^\\\n"] {
+ buffer = realloc(buffer,buffer_size+yyleng+1);
+ buffer_size += yyleng;
+ strcat(buffer,yytext);
+ }
+<STRING>\\\n /* ignore this */
+<STRING>\\{hex} {
+ int temp =0,loop = 0;
+ for(loop=yyleng-2; loop>0; loop--){
+ temp <<= 4;
+ temp += hextoint(toupper(yytext[yyleng-loop]));
+ }
+ buffer = realloc(buffer,buffer_size+1);
+ buffer[buffer_size-1] = temp;
+ buffer[buffer_size] = '\0';
+ buffer_size += 1;
+ }
+<STRING>\\{oct} {
+ int temp =0,loop = 0;
+ for(loop=yyleng-1; loop>0; loop--){
+ temp <<= 3;
+ temp += (yytext[yyleng-loop] - '0');
+ }
+ buffer = realloc(buffer,buffer_size+1);
+ buffer[buffer_size-1] = temp;
+ buffer[buffer_size] = '\0';
+ buffer_size += 1;
+ }
+<STRING>\\[^\n] {
+ buffer = realloc(buffer,buffer_size+1);
+ switch(yytext[yyleng-1]){
+ case 'b' : buffer[buffer_size-1] = '\b'; break;
+ case 't' : buffer[buffer_size-1] = '\t'; break;
+ case 'n' : buffer[buffer_size-1] = '\n'; break;
+ case 'v' : buffer[buffer_size-1] = '\v'; break;
+ case 'f' : buffer[buffer_size-1] = '\f'; break;
+ case 'r' : buffer[buffer_size-1] = '\r'; break;
+ default : buffer[buffer_size-1] = yytext[yyleng-1];
+ }
+ buffer[buffer_size] = '\0';
+ buffer_size += 1;
+ }
+<STRING>\" {
+ printf("string = \"%s\"",buffer);
+ free(buffer);
+ BEGIN(INITIAL);
+ }
+%%
+
+