Tokenizer类中用到的平衡符号的Balance类

作用:检查括号的开关是否正确,如果有错误,返回错误的第几行和总共有几处错误

package com.tokenizer.cc;

import java.io.Reader;
import java.util.Stack;
/**
 * Balance class: check for balanced symbols
 * @author SunnyBoy
 * @version Time:2017年8月5日 上午10:39:08
 */
public class Balance {
    private Tokenizer tok;
    private int errors;

    public Balance(Reader inStream) {
        errors = 0;
        tok = new Tokenizer(inStream);
    }
    /**
     * Print an error message for unbalanced symbols.
     * @return number of errors detected.
     */
    public int checkBalance() {
        char ch;
        Symbol match = null;
        Stack<Symbol> pendingTokens = new Stack<Symbol>();

        while ((ch = tok.getNextOpenClose()) != '\0') {
            Symbol lastSymbol = new Symbol(ch, tok.getLineNumber());
            switch (ch) {
            case '(':
            case '[':
            case '{':
                pendingTokens.push(lastSymbol);
                break;
            case ')':
            case ']':
            case '}':
                if (pendingTokens.isEmpty()) {
                    errors++;
                    System.out.println("Extraneous " + ch + " at line " + tok.getLineNumber());
                    ;
                } else {
                    match = pendingTokens.pop();
                    checkMath(match, lastSymbol);
                }
                break;
            default:
                break;
            }
        }
        while (!pendingTokens.isEmpty()) {
            match = pendingTokens.pop();
            System.out.println("Unmatched " + match.token + " at line " + match.theLine);
            errors++;
        }
        return errors + tok.getErrorCount();
    }
    /**
     * Print an error message if clSym does not match opSym.
     * Update errors.
     * @param opSym
     * @param clSym
     */
    private void checkMath(Symbol opSym, Symbol clSym) {
        if (opSym.token == '(' && clSym.token != ')' || opSym.token == '[' && clSym.token != ']'
                || opSym.token == '{' && clSym.token != '}') {
            System.out.println("Found " + clSym.token + " on line " + tok.getLineNumber() + "; does not match "
                    + opSym.token + " at line " + opSym.theLine);
            errors++;
        }
    }
    /**
     * Symbol nested class;
     * represents what will be placed on the stack.
     */
    private static class Symbol {
        public char token;
        public int theLine;

        public Symbol(char tok, int line) {
            token = tok;
            theLine = line;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值