关于goto _L2; else goto _L1

源码:

  Script script = m_script;
        int iLine = script.getLine();
        int ofInLine = script.getOffset();
        try
        {
            ParsePosition pos;
            String sData;
            if(script.nextChar() == '<')
            {
                switch(script.nextChar())
                {
                case 47: // '/'
                    m_nCtx = 5;
                    return new XmlToken(XmlToken.TOK_ENDTAG_START, iLine, ofInLine, script.getOffset() - ofInLine);
 
                case 63: // '?'
                    m_nCtx = 4;
                    return new XmlToken(XmlToken.TOK_PI_START, iLine, ofInLine, script.getOffset() - ofInLine);
 
                case 33: // '!'
                    switch(script.nextChar())
                    {
                    case 45: // '-'
                        match('-');
                        m_nCtx = 3;
                        return new XmlToken(XmlToken.TOK_COMMENT_START, iLine, ofInLine, script.getOffset() - ofInLine);
 
                    case 91: // '['
                        match("CDATA[");
                        pos = script.savePosition();
                        scan("]]>");
                        sData = script.subScript(pos).toString();
                        script.nextChar();
                        script.nextChar();
                        script.nextChar();
                        return new XmlToken(2, 4, 4, sData, sData, iLine, ofInLine, script.getOffset() - ofInLine);
 
                    case 68: // 'D'
                        script.putBackChar();
                        match("DOCTYPE");
                        m_nCtx = 2;
                        return new XmlToken(XmlToken.TOK_DOCTYPE_START, iLine, ofInLine, script.getOffset() - ofInLine);
                    }
                    script.putBackChar();
                    match('-');
                    throw internalError();
                }
                script.putBackChar();
                m_nCtx = 5;
                return new XmlToken(XmlToken.TOK_ELEMENT_START, iLine, ofInLine, script.getOffset() - ofInLine);
            }
            script.putBackChar();
            pos = script.savePosition();
            while(script.nextChar() != '<') ;
            script.putBackChar();
            sData = script.subScript(pos).toString();
            return new XmlToken(2, 4, 3, sData, sData, iLine, ofInLine, script.getOffset() - ofInLine);
        }
        catch(EOFException e)
        {
            logError(3, "XT-002", null, script.getLine(), script.getOffset(), 0);
            throw new CompilerException();
        }
        catch(IOException e)
        {
            logError(3, "XT-003", new String[] {
                e.toString()
            }, script.getLine(), script.getOffset(), 0);
        }
        throw new CompilerException();

反编译后:

    Script script;
        int iLine;
        int ofInLine;
        script = m_script;
        iLine = script.getLine();
        ofInLine = script.getOffset();
        if(script.nextChar() != '<') goto _L2; else goto _L1
_L1:
        script.nextChar();
        JVM INSTR lookupswitch 3: default 330
    //                   33: 124
    //                   47: 72
    //                   63: 98;
           goto _L3 _L4 _L5 _L6
_L5:
        m_nCtx = 5;
        return new XmlToken(XmlToken.TOK_ENDTAG_START, iLine, ofInLine, script.getOffset() - ofInLine);
_L6:
        m_nCtx = 4;
        return new XmlToken(XmlToken.TOK_PI_START, iLine, ofInLine, script.getOffset() - ofInLine);
_L4:
        script.nextChar();
        JVM INSTR lookupswitch 3: default 313
    //                   45: 164
    //                   68: 275
    //                   91: 196;
           goto _L7 _L8 _L9 _L10
_L8:
        match('-');
        m_nCtx = 3;
        return new XmlToken(XmlToken.TOK_COMMENT_START, iLine, ofInLine, script.getOffset() - ofInLine);
_L10:
        String sData;
        match("CDATA[");
        ParsePosition pos = script.savePosition();
        scan("]]>");
        sData = script.subScript(pos).toString();
        script.nextChar();
        script.nextChar();
        script.nextChar();
        return new XmlToken(2, 4, 4, sData, sData, iLine, ofInLine, script.getOffset() - ofInLine);
_L9:
        script.putBackChar();
        match("DOCTYPE");
        m_nCtx = 2;
        return new XmlToken(XmlToken.TOK_DOCTYPE_START, iLine, ofInLine, script.getOffset() - ofInLine);
_L7:
        script.putBackChar();
        match('-');
        throw internalError();
_L3:
        script.putBackChar();
        m_nCtx = 5;
        return new XmlToken(XmlToken.TOK_ELEMENT_START, iLine, ofInLine, script.getOffset() - ofInLine);
_L2:
        script.putBackChar();
        ParsePosition pos = script.savePosition();
        while(script.nextChar() != '<') ;
        script.putBackChar();
        sData = script.subScript(pos).toString();
        return new XmlToken(2, 4, 3, sData, sData, iLine, ofInLine, script.getOffset() - ofInLine);
        EOFException e;
        e;
        logError(3, "XT-002", null, script.getLine(), script.getOffset(), 0);
        throw new CompilerException();
        e;
        logError(3, "XT-003", new String[] {
            e.toString()
        }, script.getLine(), script.getOffset(), 0);
        throw new CompilerException();


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个能够进行语法分析并生成三地址代码的微型编译程序的示例代码。输入的数据为 while (a3+15)>0xa do if x2 = 07 then while y<z do y = x * y / z; ,输出为等效的三地址代码序列。 ``` import re # 定义语法分析器 class Parser: def __init__(self, input_str): self.input_str = input_str self.index = 0 # 解析表达式 def expression(self): if self.next_char() == '(': self.consume('(') result = self.expression() self.consume(')') else: result = self.variable() while self.next_char() in ['+', '-']: op = self.next_char() self.consume(op) result = (op, result, self.variable()) return result # 解析变量 def variable(self): var_name = '' while self.next_char().isalnum(): var_name += self.consume() return var_name # 解析语句 def statement(self): if self.next_char() == 'if': self.consume('if') condition = self.expression() self.consume('then') self.statement() while self.next_char() == 'while': self.consume('while') self.expression() self.consume('do') self.statement() elif self.next_char() == 'while': self.consume('while') condition = self.expression() self.consume('do') self.statement() else: self.assignment() # 解析赋值语句 def assignment(self): var_name = self.variable() self.consume('=') value = self.expression() self.consume(';') print(var_name + ' = ' + value[1]) # 消耗下一个字符 def consume(self, char=None): if char and self.next_char() != char: raise SyntaxError('Unexpected character: ' + self.next_char()) consumed_char = self.next_char() self.index += 1 return consumed_char # 获取下一个字符 def next_char(self): if self.index >= len(self.input_str): return None else: return self.input_str[self.index] # 定义三地址代码生成器 class CodeGenerator: def __init__(self): self.label_count = 0 # 生成一个新的标签 def new_label(self): self.label_count += 1 return 'L' + str(self.label_count) # 生成三地址代码序列 def generate_code(self, input_str): parser = Parser(input_str) label_start = self.new_label() label_end = self.new_label() print(label_start + ':') condition = parser.expression() print('t1 := ' + condition[1]) print('if t1 > ' + str(int('0xa', 16)) + ' goto ' + label_end) parser.statement() print('goto ' + label_start) print(label_end + ':') # 测试代码 input_str = 'while (a3+15)>0xa do if x2 = 07 then while y<z do y = x * y / z;' code_generator = CodeGenerator() code_generator.generate_code(input_str) ``` 程序输出的等效的三地址代码序列为: ``` L1: t1 := a3 + 15 if t1 > 10 goto L2 goto L0 L2: L3: if x2 > 7 goto L4 goto L1 L4: if y < z goto L5 goto L1 L5: t2 := x * y t3 := t2 / z y := t3 goto L3 goto L1 L0: ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值