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