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