问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Ruby写的一个对四则运算表达式解析和求值的程序

发布网友 发布时间:2022-04-25 15:53

我来回答

2个回答

热心网友 时间:2023-10-14 22:33

加上#encoding:utf-8

热心网友 时间:2023-10-14 22:33

class ParseError < Exception
end
#词法分析类
class Lex
        def initialize(strExp)
                @strExp = strExp.gsub(/\s+/, '')
        end
        def nextToken
                if @strExp =~ /^\d+/
                        @strExp = $'
                        $&.to_i
                elsif @strExp =~ /^(\+|-|\*|\/|\(|\))/
                        @strExp = $'
                        $&
                elsif @strExp =~ /^$/
                        nil
                else
                        raise ParseError.new('Unknown character ==> ' \
                                + @strExp)
                end
        end
end
#语法分析和求值在这里一勺烩了
class Syntax
        def parse(&procToken)
                @procToken = procToken
                nextToken
                val = exp
                matchType(NilClass)
                return val
        end
private
        def nextToken
                @currentToken = @procToken.call
        end
        def matchStr(t)
                if @currentToken.is_a?(String) and @currentToken == t
                        nextToken
                        return t
                else
                        requireError(t)
                end
        end
        def matchType(t)
                tmp = @currentToken
                if @currentToken.is_a?(t)
                        nextToken
                        return tmp
                else
                        requireError(t.class)
                end
        end
        def requireError(*a)
                raise ParseError.new(\
                        "require '#{a.join(',')}', " + \
                                "token='#{@currentToken}'")
        end
        def exp
                val = term
                while TRUE
                        if @currentToken == '+'
                                matchStr('+')
                                val += term
                        elsif @currentToken == '-'
                                matchStr('-')
                                val -= term
                        else
                                break
                        end
                end
                return val
        end
        def term
                val = factor
                while TRUE
                        if @currentToken == '*'
                                matchStr('*')
                                val *= factor
                        elsif @currentToken == '/'
                                matchStr('/')
                                d = factor
                                raise '除数为零' if d == 0
                                val /= d
                        else
                                break
                        end
                end
                return val
        end
        def factor
                if @currentToken.is_a?(Integer)
                        return matchType(Integer)
                elsif @currentToken == '('
                        matchStr('(')
                        val = exp
                        matchStr(')')
                        return val
                else
                        requireError(['Integer', '('])
                end
        end
end
#为了方便使用定义一个包装函数
def parseExp(exp)
        l = Lex.new(exp)
        s = Syntax.new
        s.parse { l.nextToken }
end
#测试代码
EXPS = %w{
        100
        (1)
        1+2
        1*3
        1+2-3
        5-2-1
        5-(2-1)
        1-2*3
        (1-2)*3
        4/2
        (1+2)*(3+4)
        (1+2)*(3+(4*2))
        1+(2+3 
        1+2+
        1++
        4/(1-1)
}
EXPS.each do
        |x|
        begin
                puts "#{x}=#{parseExp(x)}"
        rescue Exception => e
                puts "*Error* #{e}(#{e.class}), exp=#{x}"
        end
end

Ruby写的一个对四则运算表达式解析和求值的程序

(String) and @currentToken == t nextToken return t else requireError(t) end end def matchType(t) tmp = @currentToken if @currentToken.is_a?(t) nextToken return

这里面的p0=com是什么意思呢?整个程序执行的是什么命令呢,比如显示数 ...

p0=com是单片机控制1602液晶一般主要对其进行写操作,控制1602显示,很少从1602读数据。运算语句一般来说都表现了在存储器内的数据进行运算的行为,然后将结果存入存储器中以便日后使用。高阶命令式编程语言更能处理复杂的表达式,可能会产生四则运算和函数计算的结合。循环语句容许一些语句反复运行数次。循环...

Ruby编程语言目录

第一章:导言,包括漫游Ruby、体验Ruby、关于本书和一个Ruby版的Sudoku解答,为初学者提供了一种轻松入门的方式。第二章:Ruby程序的结构和运行,详细解释了词法结构、句法结构、文件结构、程序编码以及程序的运行流程,帮助开发者理解如何构建和执行Ruby程序。第三章:数据类型和对象,深入探讨了数字、文本...

ELITE高级计算机动态语言

在OperaMasks中,ELITE扮演着关键角色。它负责接管并扩展了原有的EL表达式解释和求值功能,既保留了原有的清晰简洁,又增强了表达逻辑的灵活性。此外,ELITE还能用于处理展现层的复杂逻辑,通过清晰的语法实现对页面构建行为的精细控制,大大提升了复用组件和创建动态表单的便利性,使得编程更加优雅。要深入了解...

现代编程语言那些让人激动的特性

渐进式语言允许类型注释来控制程序的一部分使用静态类型检查,而另一部分为动态检查,更具灵活性。 Python从3.5开始引入了对静态类型检查的支持。在面向对象的编程语言中,状态是计算的基础。由于可变状态的存在,在编写高并发,多线程代码时,无法知道并行进行的诸多状态读写中是否有顺序上的错误,而且这种...

如何评价 Racket 这门编程语言

使用惰性求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值。语句如 x:=expression; (把一个表达式的结果赋值给一个变量)明显的调用这个表达式并把计算并把结果放置到 x 中,但是先不管实际在 x 中的是什么,直到通过后面的表达式中到 x 的引用而有了对它的值的需求...

如何编写电脑FORNEXT工程

Ruby Ruby,一种为简单快捷面向对象编程(面向对象程序设计)而创的脚本语言 Scheme Scheme,一种系统设计语言,由LISP语言发展而来,属于lisp的一种方言。与其他lisp不同的是,scheme是可以编译成机器码的。Scheme的一个主要特性是可以像操作数据一样操作函数调用 Smalltalk 一种面向对象的程序设计语言 一种...

这里面的p0=com是什么意思呢?整个程序执行的是什么命令呢,比如显示数 ...

运算语句一般来说都表现了在存储器内的数据进行运算的行为,然后将结果存入存储器中以便日后使用。高阶命令式编程语言更能处理复杂的表达式,可能会产生四则运算和函数计算的结合。循环语句容许一些语句反复运行数次。循环可依据一个默认的数目来决定运行这些语句的次数;或反复运行它们,直至某些条件改变。条...

求解简单的四则运算表达式 四则运算表达式求 集合的混合运算表达式求值 四则运算的运算顺序 解析式和表达式一样吗 什么是四则运算的算式 函数解析式与表达式的区别 初中函数表达式和解析式 关系式 表达式 解析式
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
打印机硒鼓安装方法及步骤 如何安装新硒鼓? 我现在很困惑该不该和女友继续发展下去 电脑上字体怎么安装方法简单易行的字体安装步骤及技巧 网页字体显示不出.怎么办? 如何添加电脑上没有的字体解决电脑字体限制增加字体选择多样性_百度知 ... 不有效字体文件 电脑字体识别不了 梦见身上煤炭黑的长辈给我钥匙的预兆 株洲最值得一去的古镇 孕妈DHA怎样补? php中出现Parse error: syntax error, unexpected &#39; &#39; (T_STRING)? 外省的可以去浙江参加初级安全工程师证吗? DHA饭前吃还是饭后吃? 芥末油可以拌什么菜 php报错 Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or &#39;$&#39; in dha什么时候吃最好 拌芥菜头的做法步骤图,拌芥菜头怎么做好吃 PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法 swisse孕妇dha怎么吃法 Parse error: syntax error, unexpected &#39;mysql_error&#39; (T_STRING) in 孕妇该如何补充DHA? error opening new searcher什么异常 DHA饭前吃还是随餐吃 Parse error: syntax error, unexpected &#39; &#39; (T_STRING) on line 39是什么鬼? DHA应该饭前吃还是饭后 Parse error: parse error, unexpected $end in D:&#92;AppServ&#92;www&#92;new&#92;register.php on line 58 孕妇吃亚麻酸是在饭前还是饭后 php文件出现Parse error: syntax error, unexpected T_VARIABLE in dha胶囊孕妇一天中什么时候吃 修正牌dha可以空腹吃吗 浙江工业大学的安全工程专业怎么样 php报错 Parse error: syntax error, unexpected $end, expecting T_CASE or T_DEFAULT or &#39;}&#39; PHP出现Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING Parse error: syntax error, unexpected &#39;&gt;&#39; in D:&#92;wamp2&#92;11&#92;try.php on line 28 php报错Parse error: syntax error, unexpected &#39;;&#39;, expecting T_FUNCTION in 。。。 浙江注安安全工程师事务所有限公司怎么样? java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1怎么解呀? php调试错误,急求高手指教!!!Parse error: syntax error, unexpected... int.Parse(para[3].Value.ToString());这句为什么会报未将对象引用到对象的实例的错误。。 QQ空间装扮自己设计 高端QQ空间怎么弄? 我要高端大气上档次的QQ头像 黑色的QQ头像用什么气泡好? 求高端大气上档次的QQ情侣头像!跪求啦!网上找没好看的! 我想要找一些有革新高端qq字体头像我应该在哪里找啊 ? 三兄弟qq网名,个性签名,分组,头像,带 霖,伟,程的.皮肤全套有谁知道? 求:::如何用SWOT分析QQ腾讯的发展 OPERA浏览器,你们觉得怎么样??? 手机进QQ空间能否像电脑一样显示空间动画,皮肤和装扮等