Как решить проблему, которая не соответствует шаблону, который я определил в Lex? - PullRequest
0 голосов
/ 08 апреля 2019

Я пишу код 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

...