完成算术表达式的语法检测——Java

壁画不多说直接上代码

import java.util.Scanner;
import java.util.Stack;

public class Calculate {
    public static void main(String[]args)
    {
        System.out.println("请输入一个表达式,并且以#结束");
        Scanner scanner=new Scanner(System.in);
        String expression=scanner.next();
        char[] chars=expression.toCharArray();
        Calculate c1=new Calculate(chars,expression);
    }



    public Stack<Character> OPVAL;

    public  Calculate(char[] chars,String expression)
    {
        chars=expression.toCharArray();

         OPVAL=new Stack();
        int i=1;
        int n=0;
        char b;
        char c = chars[0];
        JUDGE.PanduanChuhao(expression);//除号不能为0
        /**if (expression.contains("/0"))
        {
            int j=expression.indexOf("/0");
            String str=expression.substring(expression.indexOf("/0")+2);
            System.out.println("第"+);
        }*/
        OPVAL.push('#');//压入栈底
        while (c!='#'||OPVAL.peek()!='#')
        {
            if(i==1&&expression.startsWith("("))
            {
                OPVAL.push(c);
                //System.out.println("0"+OPVAL.peek());
                c=chars[++n];
                ++i;
                while (JUDGE.JudgeOpvalOrNot(c))
                {
                    System.out.println("第  "+i+"  位  "+c+"  输入错误。");
                    try{c=chars[++n];
                    ++i;}
                    catch (Exception e)
                    {
                        System.exit(0);
                    }
                }
            }
            else if(i==1&&JUDGE.JudageOpter(c)!=7&&!expression.startsWith("("))
            {
                System.out.println("第1位  "+c+"  输入有误。");
                c=chars[++n];
                ++i;
                while (JUDGE.JudgeOpvalOrNot(c))
                {
                    System.out.println("第  "+i+"  位  "+c+"  输入错误。");
                    try
                    {c=chars[++n];
                    ++i;}
                    catch (Exception e)
                    {
                        System.exit(0);
                    }
                }
            }
            if(c>='0'&&c<='9')
            {
                while (c>='0'&&c<='9')
                {
                    c=chars[++n];
                    ++i;
                }
            }
            else if(JUDGE.JudageOpter(c)!=7) {
                if (c == '(') {
                    System.out.println("第  " + i + "  位输入错误。数字后面不能直接加(。");
                    c = chars[++n];
                    ++i;
                    while (JUDGE.JudgeOpvalOrNot(c)) {
                        System.out.println("第  " + i + "  位  " + c + "  输入错误");
                        try {
                            c = chars[++n];

                        ++i;}
                        catch (Exception e)
                        {
                            System.exit(0);
                        }
                    }
                    break;
                }
                     b = JUDGE.CompareOpter(OPVAL.peek(), c);
                //System.out.println(b);
                switch (b) {
                    case '>':
                        OPVAL.pop();
                        //System.out.println("1"+OPVAL.peek());
                        break;
                    case '<':
                        OPVAL.push(c);
                        //System.out.println("2"+OPVAL.peek());
                        c = chars[++n];
                        ++i;
                        if (c == ')') {
                            System.out.println("第  " + i + "  位输入错误。运算符不能加)");
                            c = chars[++n];
                            ++i;
                        }
                        if (c == '(') {
                            OPVAL.push(c);
                            //System.out.println("3"+OPVAL.peek());
                            c = chars[++n];
                            ++i;
                        }
                        while (JUDGE.JudgeOpvalOrNot(c)) {
                            System.out.println("第  " + i + "  位  " + c + "  输入错误。");
                            try
                            {c = chars[++n];
                            ++i;}
                            catch (Exception e)
                            {
                                System.exit(0);
                            }
                        }
                        break;
                    case '=':
                        OPVAL.pop();
                        //System.out.println("4"+OPVAL.peek());
                        c = chars[++n];
                        ++i;
                        break;
                    case 'F':
                        System.out.println("第 " + i + " 位" + c + "输 入 错误");
                        c = chars[++n];
                        ++i;
                        break;
                    case 'L':
                        OPVAL.pop();
                        //System.out.println("5"+OPVAL.peek());
                        System.out.println("第  " + i + "  位缺少 ) ");
                        break;
                }
            }
            else
            {
                System.out.println("第"+i+"位,"+c+"是 非 法 字 符 !!");
                c=chars[++n];
                ++i;
            }

        }
    }
}





class JUDGE {
    /**
     * static boolean JudgeLetterOrNot(char c)
     * {
     * <p>
     * }
     */
static int anInt=0;
    static void PanduanChuhao(String expression)
    {
        if (!expression.contains("/0")) return;
        String newstring=expression.substring(expression.indexOf("/0")+2);
        //System.out.println(expression.indexOf("/0"));
        anInt=anInt+expression.indexOf("/0")+2;
        System.out.println("第   "+anInt+"   除 号 不 能 为 0 !!!");
        PanduanChuhao(newstring);
    }
    static boolean JudgeOpvalOrNot(char c) {
        if (JudageOpter(c) != 7) {
            return true;//是运算符
        }
        return false;//不是运算符

    }

    static int JudageOpter(char c) {//判断是不是运算符,并确定是哪个运算符。
        int i = 7;

        switch (c) {
            case '+':
                i = 0;
                break;
            case '-':
                i = 1;
                break;
            case '*':
                i = 2;
                break;
            case '/':
                i = 3;
                break;
            case '(':
                i = 4;
                break;
            case ')':
                i = 5;
                break;
            case '#':
                i = 6;
                break;
            default:
                i = 7;
        }
        return i;
    }

    static char CompareOpter(char a, char b) {//辅助二维数列
        int n, m;
        n = JudageOpter(a);
        //System.out.println(n);
        m = JudageOpter(b);
        //System.out.println(m);
        char priority[][] =    //算符间的优先级关系
                {
                        {'>', '>', '<', '<', '<', '>', '>'},
                        {'>', '>', '<', '<', '<', '>', '>'},
                        {'>', '>', '>', '>', '<', '>', '>'},
                        {'>', '>', '>', '>', '<', '>', '>'},
                        {'<', '<', '<', '<', '<', '=', 'L'},
                        {'>', '>', '>', '>', 'l', '>', '>'},
                        {'<', '<', '<', '<', '<', 'F', '='},
                };

        return priority[n][m];
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一个简单的算术表达式语法分析器可以通过递归下降分析法实现。下面是一个例子: ``` class SyntaxParser: def __init__(self, expression): self.expression = expression self.index = 0 def parse(self): return self.parse_expression() def parse_expression(self): left_operand = self.parse_term() while self.index < len(self.expression): operator = self.expression[self.index] if operator not in ['+', '-']: break self.index += 1 right_operand = self.parse_term() if operator == '+': left_operand += right_operand else: left_operand -= right_operand return left_operand def parse_term(self): left_operand = self.parse_factor() while self.index < len(self.expression): operator = self.expression[self.index] if operator not in ['*', '/']: break self.index += 1 right_operand = self.parse_factor() if operator == '*': left_operand *= right_operand else: left_operand /= right_operand return left_operand def parse_factor(self): if self.expression[self.index] == '(': self.index += 1 value = self.parse_expression() self.index += 1 return value else: start = self.index while self.index < len(self.expression) and self.expression[self.index].isdigit(): self.index += 1 return int(self.expression[start:self.index]) ``` 在这个例子中,我们定义了一个 `SyntaxParser` 类来解析算术表达式。我们传入要解析的表达式作为构造函数参数,并且定义了三个方法来分别解析表达式、项和因子。 在 `parse_expression` 方法中,我们首先调用 `parse_term` 方法来解析左操作数,并进入一个循环,直到我们到达表达式的末尾或者遇到一个不是加号或减号的运算符。如果是加号,我们解析右操作数并将左右操作数相加,否则将左操作数减去右操作数。最后返回左操作数的值。 在 `parse_term` 方法中,我们首先调用 `parse_factor` 方法来解析左操作数,并进入一个循环,直到我们到达表达式的末尾或者遇到一个不是乘号或除号的运算符。如果是乘号,我们解析右操作数并将左右操作数相乘,否则将左操作数除以右操作数。最后返回左操作数的值。 在 `parse_factor` 方法中,我们首先检查当前字符是否为左括号,如果是,我们解析括号内的表达式并返回其值。否则,我们解析数字并返回其值。 例如,如果我们有一个表达式 `2 + 3 * (4 - 1)`,我们可以这样使用 `SyntaxParser` 类来解析它: ``` parser = SyntaxParser("2 + 3 * (4 - 1)") result = parser.parse() print(result) ``` 这将输出 `11`,也就是表达式计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值