如何用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语句。 我已经使它打印多个字符串或变量(与+连接)并在缺少+时打印错误消息。 我现在有两个问题:

  1. 我想在尝试打印未定义的变量时输出错误消息而不输出undefined,就像在这种情况下一样(我希望在#errors textarea中有这个消息):

    a = 240 b=120 print a + c输出为240 undefined

  2. 我希望将字符\iri改为’\ n’,以使print语句转到新行。 我使用var result2= result1.replace('\iri','\n'); 但它不起作用。

这是我的演示( DEMO )

你能帮我么?

UPDATE

我解决了第二个问题。 这是DEMO 。 你能帮我解决第一个问题吗?

这不是编写器/解释器的编写方式,但它应该用于简单的语言:

  1. 为每个语句定义正则表达式(例如,如果您只允许打印变量/^print ([az]+)$/ )。

  2. 将每一行与表达式匹配并决定做什么(例如,如果你翻译为javascript,你的print语句可能变成$('#output').append(variablename + '
    ');
    并且数学公式不需要被翻译,只是经过validation)。

  3. 如果一切正确,请执行脚本。 可能的问题:覆盖系统变量或名为关键字的变量(→在生成的代码中为变量添加前缀或将它们全部存储在同一个数组/对象中),脚本注入(→在字符串中转义' \'并替换<><>以及可能的其他限制)。

这是一个计算最大公约数的非常简单的例子:

https://jsfiddle.net/7462hbv1/6/

一些评论:

  1. 这是一种非常愚蠢的语言,但我认为这是图灵完整的。
  2. 应该进行各种检查(例如,只检查各行,如果if正确关闭则不检查)和有意义的错误消息。
  3. 仅支持一种数据类型:整数
  4. 变量名称可以包含小写和大写字母,但不能包含其他内容
  5. 语法(不完整):

      ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9  ::= [*]  ::=  =   ::=  |   ::= [*]   ::= + | - | * | / | %  ::=    ::= while   ::= end while  ::= > | < | =  ::= if     ::= else  ::= end if  ::= print "" [] 

    请注意,没有括号,您必须分割代码行,直到您的数学不再需要括号。

  6. 以下是使用这种语言的(工作!)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 
  7. 这是实际执行的代码:

     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();