Я пишу код Lex для сканирования кода Verilog и определяю шаблон, которому я хочу соответствовать. Но когда я запускаю код, я обнаруживаю, что шаблон, который я определил, не будет совпадать. Где я ошибся?
Я запускаю код на рабочей станции Linux. Flex версия 2.5.4.
%option c++
%option noyywrap
%{
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
vector<string> input_vec; /*To remember which signal is input*/
int input_num = 0; /*To count the # of input signals*/
%}
%x INPUT
var_string [a-z]+
%%
input {
cout << "BEGIN INPUT" << endl;
BEGIN INPUT;
}
[ \n\t\r\f]+
.
<INPUT>{var_string} {
cout << "IN INPUT MATCHING var_string:" << yytext << endl;
input_num++;
input_vec.push_back(yytext);
}
<INPUT>; {BEGIN 0;}
<INPUT>,
<INPUT>[ \n\t\r\f]+
%%
int main(int argc, char* argv[])
{
ifstream input_file("test.v");
FlexLexer* lexer;
lexer = new yyFlexLexer(&input_file, &cout);
while(lexer->yylex()!=0);
cout << "Input Number: " << input_num << endl;
return 0;
}
Вот код Verilog, который я хочу отсканировать.
module test(a, b, c, sum, carry);
input
a,
b,
c;
output
sum,
carry;
wire
d;
assign
d = (~b & a) | (b & ~a),
sum = (d & c) | (d & ~c),
carry= (a & b) | (b & c) | (a & c);
endmodule
Я за исключением того, что при сканировании кода Lex a, b и c в секции ввода вывод будет:
НАЧАТЬ ВВОД
INPUT Matching: переменная_строки: a
INPUT MATHING: переменная_строки: b
INPUT MATHING: переменная_строки: c
Номер ввода: 3
Однако реальный результат:
НАЧАТЬ ВВОД
Номер ввода: 0