Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 9114023
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 17, 20262026-06-17T04:06:26+00:00 2026-06-17T04:06:26+00:00

I have a program in C that solves the circuit satisfiability with MPI. The

  • 0

I have a program in C that solves the circuit satisfiability with MPI. The circuit can contain AND,OR and NOT gates.

In my program the circuit is “hard coded” as it follows:

( v[0] ||  v[1]  ) && ( !v[1]  || !v[3]  ) && (  v[2]  ||  v[3]  )

with mapping: || = OR, && = AND, ! = NOT

v[0], v[1], etc is an array of 0 and 1

At some point, i evaluate the circuit like this:

value = ( v[0] ||  v[1]  ) && ( !v[1]  || !v[3]  ) && (  v[2]  ||  v[3]  );

I want to test multiple circuits which are read from a text file.
Now, my question is: How can i convert from string to logical expression in C?

Basically, i want something like value = ‘string from file here’.

Any suggestions?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-17T04:06:27+00:00Added an answer on June 17, 2026 at 4:06 am

    Ok. I’ve modified Shunting-Yard algo for working with boolean expressions.

    Here’s code for evaluating boolean expressions:

    #include <string.h>
    #include <stdio.h>
    #define bool int
    #define false 0
    #define true 1
    
    int op_preced(const char c)
    {
        switch(c)    {
            case '|':
                return 6;
            case '&':
                return 5;
            case '!':
                return 4;
            case '*':  case '/': case '%':
                return 3;
            case '+': case '-':
                return 2;
            case '=':
                return 1;
        }
        return 0;
    }
    
    bool op_left_assoc(const char c)
    {
        switch(c)    {
            // left to right
            case '*': case '/': case '%': case '+': case '-': case '|': case '&':
                return true;
            // right to left
            case '=': case '!':
                return false;
        }
        return false;
    }
    
    unsigned int op_arg_count(const char c)
    {
        switch(c)  {
            case '*': case '/': case '%': case '+': case '-': case '=': case '&': case '|':
                return 2;
            case '!':
                return 1;
            default:
                return c - 'A';
        }
        return 0;
    }
    
    #define is_operator(c)  (c == '+' || c == '-' || c == '/' || c == '*' || c == '!' || c == '%' || c == '=' || c == '&' || c == '|')
    #define is_function(c)  (c >= 'A' && c <= 'Z')
    #define is_ident(c)     ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z'))
    
    bool shunting_yard(const char *input, char *output)
    {
        const char *strpos = input, *strend = input + strlen(input);
        char c, *outpos = output;
    
        char stack[32];       // operator stack
        unsigned int sl = 0;  // stack length
        char     sc;          // used for record stack element
    
        while(strpos < strend)   {
            // read one token from the input stream
            c = *strpos;
            if(c != ' ')    {
                // If the token is a number (identifier), then add it to the output queue.
                if(is_ident(c))  {
                    *outpos = c; ++outpos;
                }
                // If the token is a function token, then push it onto the stack.
                else if(is_function(c))   {
                    stack[sl] = c;
                    ++sl;
                }
                // If the token is a function argument separator (e.g., a comma):
                else if(c == ',')   {
                    bool pe = false;
                    while(sl > 0)   {
                        sc = stack[sl - 1];
                        if(sc == '(')  {
                            pe = true;
                            break;
                        }
                        else  {
                            // Until the token at the top of the stack is a left parenthesis,
                            // pop operators off the stack onto the output queue.
                            *outpos = sc;
                            ++outpos;
                            sl--;
                        }
                    }
                    // If no left parentheses are encountered, either the separator was misplaced
                    // or parentheses were mismatched.
                    if(!pe)   {
                        printf("Error: separator or parentheses mismatched\n");
                        return false;
                    }
                }
                // If the token is an operator, op1, then:
                else if(is_operator(c))  {
                    while(sl > 0)    {
                        sc = stack[sl - 1];
                        if(is_operator(sc) &&
                            ((op_left_assoc(c) && (op_preced(c) >= op_preced(sc))) ||
                               (op_preced(c) > op_preced(sc))))   {
                            // Pop op2 off the stack, onto the output queue;
                            *outpos = sc;
                            ++outpos;
                            sl--;
                        }
                        else   {
                            break;
                        }
                    }
                    // push op1 onto the stack.
                    stack[sl] = c;
                    ++sl;
                }
                // If the token is a left parenthesis, then push it onto the stack.
                else if(c == '(')   {
                    stack[sl] = c;
                    ++sl;
                }
                // If the token is a right parenthesis:
                else if(c == ')')    {
                    bool pe = false;
                    // Until the token at the top of the stack is a left parenthesis,
                    // pop operators off the stack onto the output queue
                    while(sl > 0)     {
                        sc = stack[sl - 1];
                        if(sc == '(')    {
                            pe = true;
                            break;
                        }
                        else  {
                            *outpos = sc;
                            ++outpos;
                            sl--;
                        }
                    }
                    // If the stack runs out without finding a left parenthesis, then there are mismatched parentheses.
                    if(!pe)  {
                        printf("Error: parentheses mismatched\n");
                        return false;
                    }
                    // Pop the left parenthesis from the stack, but not onto the output queue.
                    sl--;
                    // If the token at the top of the stack is a function token, pop it onto the output queue.
                    if(sl > 0)   {
                        sc = stack[sl - 1];
                        if(is_function(sc))   {
                            *outpos = sc;
                            ++outpos;
                            sl--;
                        }
                    }
                }
                else  {
                    printf("Unknown token %c\n", c);
                    return false; // Unknown token
                }
            }
            ++strpos;
        }
        // When there are no more tokens to read:
        // While there are still operator tokens in the stack:
        while(sl > 0)  {
            sc = stack[sl - 1];
            if(sc == '(' || sc == ')')   {
                printf("Error: parentheses mismatched\n");
                return false;
            }
            *outpos = sc;
            ++outpos;
            --sl;
        }
        *outpos = 0; // Null terminator
        return true;
    }
    
    bool evalBoolExpr(char * expr)  {
        char output[500] = {0};
        char * op;
        bool tmp;
        char part1[250], part2[250];
    
        if(!shunting_yard(expr, output))
          return false;  // oops can't convert to postfix form
    
        while (strlen(output) > 1) {
            op = &output[0];
            while (!is_operator(*op) && *op != '\0')
              op++;
            if (*op == '\0') {
              return false;  // oops - zero operators found
            }
            else if (*op == '!') {
                tmp = !(*(op-1) - 48);
                *(op-1) = '\0';
            }
            else if(*op == '&') {
                tmp = (*(op-1) - 48) && (*(op-2) - 48);
                *(op-2) = '\0';
            }
            else if (*op == '|') {
                tmp = (*(op-1) - 48) || (*(op-2) - 48);
                *(op-2) = '\0';
            }
    
            memset(part1, 0, sizeof(part1));
            memset(part2, 0, sizeof(part2));
            strcpy(part1, output);
            strcpy(part2, op+1);
            memset(output, 0, sizeof(output));
            strcat(output, part1);
            strcat(output, ((tmp==false) ? "0" : "1"));
            strcat(output, part2);
        }
        return *output - 48;
    }
    
    int main() {
        char * boolString[2] = {"FALSE", "TRUE"};
        char * expr = "!((1 | 0) & (1 & ((1 & !0) | 0)))";
        bool result = evalBoolExpr(expr);
        printf("Boolean expr. %s is %s", expr, boolString[result]);
        return 0;
    }
    

    Just put & / | symbols in logical expresion instead of double &&/ ||.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a program that solves the weighted interval scheduling problem using dynamic programming
I am making a program that solves an equation. I have a variable that
I am doing this assignment, make a program that solves sudoku. I have a
i'm trying to write a program that solves the rsa challenge (yes i have
So I have a program that solves a system of linear equations, but that
Basically, I have to write a basic program that solves the n-queen problem, which
Do they exist? I have written a program that solves sudoku puzzles, and it
To print debug messages in my program, I have a that can be used
I have program that requires Python 3, but I develop Django and it uses
I have program that has a variable that should never change. However, somehow, it

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.