如何用JavaScript / jQuery解释textarea中的字符串?
我正在尝试用JavaScript / jQuery创建一个小的解释程序。 所以我想要的是当用户在textarea中输入一些文本时,程序应该解释该文本并在另一个文本区域中打印输出。 直到现在我已经实现了这个目标:
https://jsfiddle.net/7462hbv1/
有了这个,我能够捕获用户在文本区域中输入的每个字符串。 但是现在我想要用户例如输入:
number a =1 number b=2 number sum=0 sum =a +b print sum
程序应该解释这个,在这种情况下输出应该是3
。 任何人都可以告诉我如何做到这一点? 我正在考虑构建一个二维数组并保存每一行(每行有类型,名称,值),然后使用此数组进行计算。 我将不胜感激任何帮助。 先感谢您
UPDATE
我使用过我的例子,特别是print语句。 我已经使它打印多个字符串或变量(与+连接)并在缺少+时打印错误消息。 我现在有两个问题:
-
我想在尝试打印未定义的变量时输出错误消息而不输出undefined,就像在这种情况下一样(我希望在
#errors
textarea中有这个消息):a = 240 b=120 print a + c
输出为240 undefined
-
我希望将字符
\iri
改为’\ n’,以使print语句转到新行。 我使用var result2= result1.replace('\iri','\n');
但它不起作用。
这是我的演示( DEMO )
你能帮我么?
UPDATE
我解决了第二个问题。 这是DEMO 。 你能帮我解决第一个问题吗?
这不是编写器/解释器的编写方式,但它应该用于简单的语言:
-
为每个语句定义正则表达式(例如,如果您只允许打印变量
/^print ([az]+)$/
)。 -
将每一行与表达式匹配并决定做什么(例如,如果你翻译为javascript,你的print语句可能变成
$('#output').append(variablename + '
并且数学公式不需要被翻译,只是经过validation)。
'); -
如果一切正确,请执行脚本。 可能的问题:覆盖系统变量或名为关键字的变量(→在生成的代码中为变量添加前缀或将它们全部存储在同一个数组/对象中),脚本注入(→在字符串中转义
'
\'
并替换<
和>
与<
和>
以及可能的其他限制)。
这是一个计算最大公约数的非常简单的例子:
https://jsfiddle.net/7462hbv1/6/
一些评论:
- 这是一种非常愚蠢的语言,但我认为这是图灵完整的。
- 应该进行各种检查(例如,只检查各行,如果
if
正确关闭则不检查)和有意义的错误消息。 - 仅支持一种数据类型:整数
- 变量名称可以包含小写和大写字母,但不能包含其他内容
-
语法(不完整):
::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ::= [ *] ::= = ::= | ::= [ *] ::= + | - | * | / | % ::= ::= while ::= end while ::= > | < | = ::= if ::= else ::= end if ::= print " " [ ] 请注意,没有括号,您必须分割代码行,直到您的数学不再需要括号。
-
以下是使用这种语言的(工作!)GCD程序的样子:
print "Euclidean algorithm" a = 240 print "a = " a b = 360 print "b = " b if a > 0 while b if a > b a = a - b else b = b - a end if end while print "gcd: " a else print "gcd: " b end if
-
这是实际执行的代码:
myProgram=function(){var variables=[];var pOut='';pOut+='Euclidean algorithm\n';variables['a']=240;pOut+='a = '+variables['a']+'\n';variables['b']=360;pOut+='b = '+variables['b']+'\n';if(variables['a']>0){while(variables['b']){if(variables['a']>variables['b']){variables['a']=variables['a']-variables['b'];}else{variables['b']=variables['b']-variables['a'];}}pOut+='gcd: '+variables['a']+'\n';}else{pOut+='gcd: '+variables['b']+'\n';}$('#output').html(pOut);};myProgram();