如何使用 JavaScript/jQuery 解释文本区域中的字符串?

How can I interpret strings in textarea with JavaScript/jQuery?

我正在尝试用 JavaScript/jQuery 制作一个小的口译程序。所以我想要的是,当用户在文本区域中输入一些文本时,程序应该解释该文本并在另一个文本区域中打印输出。 到目前为止,我已经做到了:

https://jsfiddle.net/7462hbv1/

有了这个我就可以捕获用户在文本区域中输入的每个字符串。但是现在我希望当用户输入时:

number a =1
number b=2
number sum=0
sum =a +b
print sum

程序应该对此进行解释,在这种情况下输出应该是 3。 谁能告诉我我该怎么做?我正在考虑构建一个二维数组并将每一行保存在那里(每一行都有类型、名称、值),然后用这个数组进行计算。 我将不胜感激任何帮助。提前谢谢你

更新

我已经使用了我的示例,特别是打印语句。我已经让它打印多个字符串或变量(与+连接)并在缺少+时打印错误消息。 我现在有两个问题:

  1. 我想在尝试打印未定义变量时出现错误消息,而不是像在这种情况下那样输出未定义(我想在 #errors 文本区域中显示该消息):

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

  2. 我想让字符 \iri 而不是 '\n' 以便打印语句转到新行。我已经这样做了 var result2= result1.replace('\iri','\n'); 但它不起作用。

这是我的演示(DEMO)

你能帮帮我吗?

更新

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

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

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

  2. 将每一行与表达式匹配并决定要做什么(例如,如果你翻译成 javascript 你的打印语句可能变成 $('#output').append(variablename + '<br>'); 而数学公式不需要完全没有翻译,只是经过验证)。

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

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

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

一些备注:

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

    <int> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
    <integer> ::= <int>[<int>*]
    <assignment> ::= <variable> = <formula>
    <value> ::= <integer> | <variable>
    <formula> ::= [<formulaPart>*] <value>
    <operator> ::= + | - | * | / | %
    <formulaPart> ::= <value> <operator>
    <while> ::= while <variable>
    <endWhile> ::= end while
    <comparator> ::= > | < | =
    <if> ::= if <variable> <comparator> <value>
    <else> ::= else
    <endIf> ::= end if
    <print> ::= print "<message>" [<variable>]
    

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

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