2017-01-12 3 views
-1

Я новичок и хочу знать, как я могу хранить совпадающие символы в программе Flex, а затем печатать их в одной строке в основном. У меня есть шаблоны и правила ниже:Сохранять совпадающие символы в flex

ID [A] 
ID1 [B] 
ID2 [C] 
ID3 [D] 

%% 
{ID} 
{ID1} 
{ID2} 
{ID3} 
+0

Разве это не то, что означает 'yytext'? Конечно, в его нынешнем виде у вас есть только действия по умолчанию для шаблонов (и для моего образа мышления, 'ID' должен иметь числовой суффикс, но это проблема æsthetics), поэтому вам нужно будет сделать некоторую работу чтобы дать 'main()' возможность обрабатывать совпадающие символы. Наличие односимвольных классов символов, как показано, немного странно, хотя и не является формальным. Вы также должны использовать некоторое пространство. –

+0

Да, существует yytext() в главном – tzavsk

+0

'yytext()'? Функция? Я привык думать, что «yytext» является либо «char yytext [];», либо «char * yytext;», и я, кажется, помню, какой вариант был доступен, зависит от того, какой вариант Lex используется, и я не вспомните, что делает Flex. Вам нужно добавить что-то после каждого шаблона, чтобы вернуться к 'main()' - что-то вроде '{return 1; } 'для указания успешного соответствия. Все, что не соответствует, игнорируется, IIRC. –

ответ

0

Это более или менее MCVE (Minimal, Complete, Verifiable Example) для распознавания и захвата части работы - это также усиливает уникальность. Он использует assert(), чтобы гарантировать, что токены являются одиночными (не нулевыми) символами.

%{ 
#include <assert.h> 
%} 
%option noinput 
%option nounput 
%option noyywrap 
ID0 [A] 
ID1 [B] 
ID2 [C] 
ID3 [D] 
ID4 [E] 
%% 
{ID0}  { printf("{ID0}: %s\n", yytext); return 1; } 
{ID1}  { printf("{ID1}: %s\n", yytext); return 1; } 
{ID2}  { printf("{ID2}: %s\n", yytext); return 1; } 
{ID3}  { printf("{ID3}: %s\n", yytext); return 1; } 
{ID4}  { printf("{ID4}: %s\n", yytext); return 1; } 
.   { printf(" . : %s\n", yytext);   } 
%% 

int main(void) 
{ 
    char token[512] = ""; 
    char *ptr = token; 

    /* Efficiency and safety is not under discussion */ 
    while (yylex()) 
    { 
     assert(yytext[0] != '\0' && yytext[1] == '\0'); 
     if (strchr(token, yytext[0]) == 0) 
      *ptr++ = yytext[0]; 
    } 
    *ptr = '\0'; 
    printf("Token sequence: [%s]\n", token); 
    return 0; 
} 

(я переименовал ID к ID0 для лучшего соответствия имен.)

Пример выполнения (я использовал имя fx83.l для источника и, следовательно, fx83 как название программы, генерируемого из источника) :

$ ./fx83 <<< "aBcDeAbCdEFf" 
    . : a 
{ID1}: B 
    . : c 
{ID3}: D 
    . : e 
{ID0}: A 
    . : b 
{ID2}: C 
    . : d 
{ID4}: E 
    . : F 
{ID0}: A 
{ID1}: B 
    . : d 
{ID2}: C 
{ID3}: D 
    . : e 
{ID4}: E 
{ID4}: E 
    . : f 

Token sequence: [BDACE] 
$ 

(я не думаю, что это важно, но я использую flex 2.5.35 Apple(flex-31) на MacOS Sierra 10.12.2 с GCC 6.2.0.)

+0

большое вам спасибо за вашу помощь и ваше время. Теперь все в порядке – tzavsk

Смежные вопросы