Skip to main content

3. Write a lex program to display the number of lines, words and characters in an input text.



There's a Lex program that displays the number of lines, words, and characters in an input text, along with explanations for each line of code:


```lex

%{

#include <stdio.h>

int lineCount = 0;

int wordCount = 0;

int charCount = 0;

%}


%%

\n         { lineCount++; }          // Match newline characters

[^\n\t ]+  { wordCount++; }          // Match non-space, non-tab, non-newline characters

[^\n]+     { charCount += yyleng; }  // Match any characters

.         ;                          // Match any other characters

%%


int main() {

    yylex();  // Start Lex analysis

    printf("Lines: %d\nWords: %d\nCharacters: %d\n", lineCount, wordCount, charCount);

    return 0;

}

```


Explanation of each line:


1. `%{ ... %}`: This section allows you to include C code that will be copied directly into the generated Lex code.


2. `#include <stdio.h>`: This includes the standard I/O library for printing.


3. `int lineCount = 0;`: Declare a variable to count lines and initialize it to 0.


4. `int wordCount = 0;`: Declare a variable to count words and initialize it to 0.


5. `int charCount = 0;`: Declare a variable to count characters and initialize it to 0.


6. `%%`: This is the start of the Lex rules section.


7. `\n         { lineCount++; }`: This rule matches newline characters and increments the line count.


8. `[^\n\t ]+  { wordCount++; }`: This rule matches sequences of characters that are not spaces, tabs, or newlines, and increments the word count.


9. `[^\n]+     { charCount += yyleng; }`: This rule matches any sequence of characters that is not a newline and increments the character count by the length of the matched sequence.


10. `.`: This rule matches any character that didn't match any of the previous rules.


11. `;`: This rule is a no-op, it simply matches a single character and does nothing.


12. `%%`: This marks the end of the Lex rules section.


13. `int main() {`: The main function of the program starts here.


14. `yylex();`: Initiates Lex analysis.


15. `printf("Lines: %d\nWords: %d\nCharacters: %d\n", lineCount, wordCount, charCount);`: Prints the counts of lines, words, and characters.


16. `return 0;`: Exits the program with a success status.


This Lex program matches and counts lines, words, and characters in the input text, and then prints the counts using the `printf` statement in the `main` function.


Comments

Popular posts from this blog

12. Write a program to convert NFA to DFA.

Converting a Non-Deterministic Finite Automaton (NFA) to a Deterministic Finite Automaton (DFA) involves creating a new DFA where each state corresponds to a set of NFA states reachable under certain conditions. Below is a simple Python program to perform this conversion. I'll explain each line of code: ```python from collections import defaultdict def epsilon_closure(states, transitions, epsilon):     closure = set(states)     stack = list(states)          while stack:         state = stack.pop()         for next_state in transitions[state].get(epsilon, []):             if next_state not in closure:                 closure.add(next_state)                 stack.append(next_state)          return closure def nfa_to_dfa(nfa_states, nfa_transitions, alphabet, start_state, n...