Рубрики

Программа Lex для распознавания действительного арифметического выражения и идентификации идентификаторов и операторов

Проблема: Напишите программу Lex для распознавания действительного арифметического выражения и определения идентификаторов и операторов.

Объяснение:
Flex (Fast lexical Analyzer Generator) — это инструмент / компьютерная программа для генерации лексических анализаторов (сканеров или лексеров), написанная Верном Паксоном в C примерно в 1987 году. Lex читает входной поток, задающий лексический анализатор, и выводит исходный код, реализующий лексер в C язык программирования. Функция yylex () является основной функцией flex, которая запускает секцию правил.

Примеры:

Input: a+b*c
Output: valid expression
        the operators are :
        + 
        * 
        the identifiers  are :
        a 
        b 
        c

Input: a+b-
Output: invalid expression
 
Input: (a*b)
Output: valid expression
        the operators are :
        * 
        the identifiers are :
        a 
        b 

Input: (a+b-
Output: invalid expression 

Реализация:

/ * Программа Lex для распознавания действительного арифметического выражения

        и идентифицировать идентификаторы и операторы * /

%{ 
#include <stdio.h> 
#include <string.h> 

    int operators_count = 0, operands_count = 0, valid = 1, top = -1, l = 0, j = 0; 

    char operands[10][10], operators[10][10], stack[100]; 

%} 
%%

"("

    top++; 

    stack[top] = '('

"{" {

    top++; 

    stack[top] = '{'

"["

    top++; 

    stack[top] = '['

")"

    if (stack[top] != '(') { 

        valid = 0;     

    

    else if(operands_count>0 && (operands_count-operators_count)!=1){

        valid=0;

    }

    else{

        top--;

        operands_count=1;

        operators_count=0;

    

"}"

    if (stack[top] != '{') { 

        valid = 0;     

    

    else if(operands_count>0 && (operands_count-operators_count)!=1){

        valid=0;

    }

    else{

        top--;

        operands_count=1;

        operators_count=0;

    

"]"

    if (stack[top] != '[') { 

        valid = 0; 

    

    else if(operands_count>0 && (operands_count-operators_count)!=1){

        valid=0;

    }

    else{

        top--;

        operands_count=1;

        operators_count=0;

    

          

"+"|"-"|"*"|"/"

    operators_count++; 

    strcpy(operators[l], yytext); 

    l++; 


[0-9]+|[a-zA-Z][a-zA-Z0-9_]* { 

    operands_count++; 

    strcpy(operands[j], yytext); 

    j++; 


%% 

  

  

int yywrap() 

    return 1; 

int main() 

    int k; 

    printf("Enter the arithmetic expression: "); 

    yylex(); 

  

    if (valid == 1 && top == -1) { 

        printf("\nValid Expression\n"); 

    

    else

        printf("\nInvalid Expression\n"); 

  

    return 0;

Выход:

Рекомендуемые посты:

Программа Lex для распознавания действительного арифметического выражения и идентификации идентификаторов и операторов

0.00 (0%) 0 votes