Почему программа не возвращает YYText () или YYLeng ()? - PullRequest
0 голосов
/ 26 февраля 2012

Я пытаюсь создать лексический анализатор, который будет возвращать длину токена в текстовом файле.

У меня есть текстовый файл с одной буквой «а».

Ниже приведен мой файл lex.l

%option noyywrap 
%{
%}

/* regular definitions */
delim           [ \t\n]
ws              {delim}+
letter          [A-Za-z]
digit           [0-9]

%%

{ws}            {/* no action */}
letter          {return 1;}

%%

Ниже приведен основной файл программы, в котором используются функции YYText () и YYLeng ().

#include <stdio.h>
#include <stdlib.h>
#include "lex.yy.cc"

using namespace std;

int OpenInputOutput(int argc, char *argv[], ifstream & lexerFIn, ofstream & lexerFOut)
{
// open input
if (argc > 1) {
    lexerFIn.open(argv[1]);
    if (lexerFIn.fail()) {
        cerr << "Input file cannot be opened\n";
        return 0;
        }
    }
else {
cerr << "Input file not specified\n";
return 0;
}

// open output
lexerFOut.open("Output.txt");
if (lexerFOut.fail()) {
    cerr << "Output file cannot be opened\n";
    return 0;
}
}

int main(int argc, char *argv[]) 
{
yyFlexLexer lexer; 
while (lexer.yylex() != 0) {
    cout << lexer.YYText() << endl;
    cout << lexer.YYLeng() << endl;
}
return 0; 
} 

Когда я запускаю программу с вышеупомянутым текстовым файлом с помощью команды ./a «sample.txt», она записывает в файл «a». Почему он не обращается к YYText () или YYLeng () и не записывает длину символа в выходной файл?

Ответы [ 3 ]

1 голос
/ 26 февраля 2012

Вы можете позвонить YYText или YYLeng только после того, как синтаксический анализатор сопоставил токен. Вы не можете позвонить им, прежде чем анализировать что-либо. Вы получаете свойства совпадения, которого никогда не было.

Это та же проблема, что и при случайном получении значения errno.

0 голосов
/ 27 февраля 2012

yylex () возвращает только для действий, которые return VALUE; или EOF. cout << lexer.YYText() << endl; & Co., таким образом, выполняется только для ввода letter.

Таким образом, вам нужно либо перенести выходной код в действия сканера, либо return VALUE; в каждом действии. NB. В последнем случае я не знаю, гарантированно ли существуют значения yytext / yylen и будут ли они значимыми после возврата к вызывающей стороне yylex ().

0 голосов
/ 26 февраля 2012

Функция yylex() будет считывать со стандартного ввода, если вы не сделаете что-то, чтобы заставить ее работать по-другому.Итак, он ждет, чтобы вы набрали букву или пробел.

...