fork download
  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int numOfProductions;
  5. char productionSet[10][10];
  6.  
  7. void FIRST(char[], char);
  8. void addToResultSet(char[], char);
  9.  
  10. int main()
  11. {
  12. int i;
  13. char choice, c, result[20];
  14.  
  15. printf("How many number of productions?: ");
  16. scanf(" %d", &numOfProductions);
  17.  
  18. for (i = 0; i < numOfProductions; i++)
  19. {
  20. printf("Enter productions Number %d: ", i + 1);
  21. scanf(" %s", productionSet[i]);
  22. }
  23.  
  24. do
  25. {
  26. printf("\nFind the FIRST of: ");
  27. scanf(" %c", &c);
  28. FIRST(result, c); // Compute FIRST; Get Answer in 'result' array
  29. printf("\nFIRST(%c) = { ", c);
  30. for (i = 0; result[i] != '\0'; i++)
  31. printf("%c ", result[i]); // Display result
  32. printf("}\n");
  33. printf("Press 'y' to continue: ");
  34. scanf(" %c", &choice);
  35. } while (choice == 'y' || choice == 'Y');
  36.  
  37. return 0;
  38. }
  39.  
  40. void FIRST(char *Result, char c)
  41. {
  42. int i, j, k;
  43. char subResult[20];
  44. int foundEpsilon;
  45.  
  46. subResult[0] = '\0';
  47. Result[0] = '\0';
  48.  
  49. // If X is terminal, FIRST(X) = {X}
  50. if (!(isupper(c)))
  51. {
  52. addToResultSet(Result, c);
  53. return;
  54. }
  55.  
  56. // If X is non-terminal then read each production
  57. for (i = 0; i < numOfProductions; i++)
  58. {
  59. // Find production with X as LHS
  60. if (productionSet[i][0] == c)
  61. {
  62. if (productionSet[i][2] == '$') // epsilon production
  63. addToResultSet(Result, '$');
  64. else
  65. {
  66. j = 2;
  67. while (productionSet[i][j] != '\0')
  68. {
  69. foundEpsilon = 0;
  70. FIRST(subResult, productionSet[i][j]);
  71. for (k = 0; subResult[k] != '\0'; k++)
  72. addToResultSet(Result, subResult[k]);
  73. for (k = 0; subResult[k] != '\0'; k++)
  74. {
  75. if (subResult[k] == '$')
  76. {
  77. foundEpsilon = 1;
  78. break;
  79. }
  80. }
  81. // No epsilon found, no need to check next element
  82. if (!foundEpsilon)
  83. break;
  84. j++;
  85. }
  86. }
  87. }
  88. }
  89. return;
  90. }
  91.  
  92. void addToResultSet(char Result[], char val)
  93. {
  94. int k;
  95. for (k = 0; Result[k] != '\0'; k++)
  96. {
  97. if (Result[k] == val)
  98. return;
  99. }
  100. Result[k] = val;
  101. Result[k + 1] = '\0';
  102. }
Success #stdin #stdout #stderr 0.04s 6864KB
stdin
#include <stdio.h>
#include <ctype.h>

int numOfProductions;
char productionSet[10][10];

void FIRST(char[], char);
void addToResultSet(char[], char);

int main()
{
    int i;
    char choice, c, result[20];

    printf("How many number of productions?: ");
    scanf(" %d", &numOfProductions);

    for (i = 0; i < numOfProductions; i++)
    {
        printf("Enter productions Number %d: ", i + 1);
        scanf(" %s", productionSet[i]);
    }

    do
    {
        printf("\nFind the FIRST of: ");
        scanf(" %c", &c);
        FIRST(result, c); // Compute FIRST; Get Answer in 'result' array
        printf("\nFIRST(%c) = { ", c);
        for (i = 0; result[i] != '\0'; i++)
            printf("%c ", result[i]); // Display result
        printf("}\n");
        printf("Press 'y' to continue: ");
        scanf(" %c", &choice);
    } while (choice == 'y' || choice == 'Y');

    return 0;
}

void FIRST(char *Result, char c)
{
    int i, j, k;
    char subResult[20];
    int foundEpsilon;

    subResult[0] = '\0';
    Result[0] = '\0';

    // If X is terminal, FIRST(X) = {X}
    if (!(isupper(c)))
    {
        addToResultSet(Result, c);
        return;
    }

    // If X is non-terminal then read each production
    for (i = 0; i < numOfProductions; i++)
    {
        // Find production with X as LHS
        if (productionSet[i][0] == c)
        {
            if (productionSet[i][2] == '$') // epsilon production
                addToResultSet(Result, '$');
            else
            {
                j = 2;
                while (productionSet[i][j] != '\0')
                {
                    foundEpsilon = 0;
                    FIRST(subResult, productionSet[i][j]);
                    for (k = 0; subResult[k] != '\0'; k++)
                        addToResultSet(Result, subResult[k]);
                    for (k = 0; subResult[k] != '\0'; k++)
                    {
                        if (subResult[k] == '$')
                        {
                            foundEpsilon = 1;
                            break;
                        }
                    }
                    // No epsilon found, no need to check next element
                    if (!foundEpsilon)
                        break;
                    j++;
                }
            }
        }
    }
    return;
}

void addToResultSet(char Result[], char val)
{
    int k;
    for (k = 0; Result[k] != '\0'; k++)
    {
        if (Result[k] == val)
            return;
    }
    Result[k] = val;
    Result[k + 1] = '\0';
}
stdout
Standard output is empty
stderr
ERROR: /home/EAmVhR/prog:102:0: Syntax error: end_of_file_in_quasi_quotation
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Can't ignore goal at this port
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Can't ignore goal at this port
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: Can't ignore goal at this port
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ?    Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ?    Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ?    Exception: (3) ... ? ERROR: Unknown option (h for help)
   Exception: (3) ... ?    Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ?    Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ?    Exception: (3) program ?    Exception: (3) program ?    Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ?    Call: (3) program ? ERROR: Unknown option (h for help)
   Call: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: Can't ignore goal at this port
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Can't ignore goal at this port
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? [Illegal port specification]
   Exception: (3) program ? ERROR: Can't ignore goal at this port
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? ERROR: Unknown option (h for help)
   Exception: (3) program ? % Execution Aborted
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit