Question

I have 4 rules

rule1: match variable 
rule2: match Float 
rule3: match Integer 
rule4: [ \t] ; //skipping space, tabs 
rule5: \n ;

now I want to have a rule for matching error, anything else that is not ID,Float,Integer, eg:"&^()>~...."

So this is the rule I created:

. {   printf("found an error:%s\n",yytext);
      err_count++;
}

But there is something wrong, it catches an unknown token whenever scanner jumps to next line.

My input:

12+32+22:18,18
99558^8*6
15.~646(5
My output

    Found a number:12
    Found a error:+
    Found a number:32
    Found a error:+
    Found a number:22
    Found a error::
    Found a number:18
    Found a error:,
    Found a number:18
    Found a error:
    Found a number:99558
    Found a error:^
    Found a number:8
    Found a error:*
    Found a number:6
    Found a error:
    Found a float:15.
    Found a error:~
    Found a number:646
    Found a error:(
    Found a number:5

for debug purpose, I try to find out the token by enclose it with square bracket

. {
        printf("Found a error:[%s]\n",yytext);
        err_count++;
        }

bash show:
    Found a number:12
    Found a error:[+]
    Found a number:32
    Found a error:[+]
    Found a number:22
    Found a error:[:]
    Found a number:18
    Found a error:[,]
    Found a number:18
    ]ound a error:[
    Found a number:99558
    Found a error:[^]
    Found a number:8
    Found a error:[*]
    Found a number:6
    ]ound a error:[
    Found a float:15.
    Found a error:[~]
    Found a number:646
    Found a error:[(]
    Found a number:5

 redirect output to a txt file
    Found a number:12
    Found a error:[+]
    Found a number:32
    Found a error:[+]
    Found a number:22
    Found a error:[:]
    Found a number:18
    Found a error:[,]
    Found a number:18
    Found a error:[
    ]
    Found a number:99558
    Found a error:[^]
    Found a number:8
    Found a error:[*]
    Found a number:6
    Found a error:[
    ]
    Found a float:15.
    Found a error:[~]
    Found a number:646
    Found a error:[(]
    Found a number:5

Anyone know what causing the problem ? Thanks And I can assure you rule5: \n ; is working properly, here is the proof

I add print to rule5"\n { printf("newline\n"); 

redirect output to a txt file
Found a number:12
Found a error:[+]
Found a number:32
Found a error:[+]
Found a number:22
Found a error:[:]
Found a number:18
Found a error:[,]
Found a number:18
Found a error:[
]
newline
Found a number:99558
Found a error:[^]
Found a number:8
Found a error:[*]
Found a number:6
Found a error:[
]
newline
Found a float:15.
Found a error:[~]
Found a number:646
Found a error:[(]
Found a number:5
Found a error:[
]
newline
Found a variable:T189_10
Found a error:[@]
Found a float:12.2
Found a error:[
]
newline
Found a number:1
Found a variable:ABB21u
Found a error:[=]
Found a variable:ier_
Found a error:[
]
newline
Found a error:[$]
Found a error:[%]
Found a error:[^]
Was it helpful?

Solution

you have to look for the carriage return character (\r), is it common for the windows system insert two character when is pressed the Return button, the two character are new line (\n) and carriage return (\r), add it in this way:

rule4: [ \t\r]

and it will work fine.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top