gpt4 book ai didi

javascript - Javascript 的 MathML 生成算法。任何推荐引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:35 25 4
gpt4 key购买 nike

我正在尝试构建可以为传统数学输入生成 MathML 的代码。我正在使用 JavaScript 进行编码。是否有任何引用资料或推荐读物可以帮助我掌握所需的算法?我正在阅读 MathML 的 W3C 标准,它是标准的引用,但不是算法的引用。

例如,对于

的示例输入
sqrt 9 * 5 + 20

我想生成如下所示的 MathML 表达式

<math xmlns='w3.org/1998/Math/MathML'>; <mrow> <mrow> <mn>5</mn> <mo>&#8290;</mo> <mn>9</mn> <mo>&#8290;</mo> <mi>SQRT</mi> </mrow> <mo>+</mo> <mn>20</mn> </mrow> </math>

最佳答案

我在这里找到了一个很好的 MathML 教程:http://rypress.com/tutorials/mathml/basic-algebra.html并开始制定一个非常基本的代数解析器(例如,4*sqrt(x+6)=(5-z)*y/7),其中包含一个用于处理括号的原始堆栈和一个示例sqrt 函数。这是您追求的方向吗?

jsfiddle 在这里:http://jsfiddle.net/alhambra1/bSJyE/

JavaScript 代码:

<script>
document.write('<p><input id="input" size=50>')
document.write('<button onclick="convertToMathML()">Convert</button></p>')
document.write('<div id="output"></div>')

function lex(str,ptr){
var ascii = str.charCodeAt(ptr),
lexeme = {string: "", type: ""},
operators = {"+": "+"
, "-": "-"
, "*": "&times;"
, "/": "&divide;"
, "=": "="},
functions = {sqrt: "msqrt"}

//identify type
if (ascii == 41)
lexeme.type = "closeBracket"
else if (ascii == 40){
lexeme.type = "func"
lexeme.func = "mfenced"
}
else if (ascii > 45 && ascii < 58 && ascii != 47)
lexeme.type = "mn"
else if ((ascii > 64 && ascii < 91) || (ascii > 96 && ascii < 123)){
for (i in functions){
if (str.substr(ptr,i.length).toLowerCase() == i){
lexeme.type = "func"
lexeme.func = functions[i]
ptr += i.length - 1
} else
lexeme.type = "mi"
}
} else if (!operators[str.charAt(ptr)])
return {string: str.charAt(ptr), type: "error", pointer: ptr}
else
lexeme.type = "mo"

switch (lexeme.type){
case "mo":
lexeme.string = operators[str.charAt(ptr++)]
break
default:
lexeme.string = str.charAt(ptr++)
break
}

ascii = str.charCodeAt(ptr)

//identify numbers and functions
if (lexeme.type == "mn"){
while (ptr < str.length && ascii > 45 && ascii < 58 && ascii != 47){
lexeme.string += str.charAt(ptr)
ascii = str.charCodeAt(++ptr)
}
} else if (lexeme.type == "func" && lexeme.func != "mfenced"){
while (ptr < str.length && str.substr(ptr).match(/^\s/)){
ascii = str.charCodeAt(++ptr)
}
if (str.charAt(ptr) != "(")
return {string: str.charAt(ptr), type: "error", pointer: ptr}
else
ptr++
}

lexeme["pointer"] = ptr

return lexeme
}

function markup(lexeme){
return "<" + lexeme.type + ">\n"
+ lexeme.string + "\n"
+ "</" + lexeme.type + ">\n"
}

function convertToMathML(){
var str = document.getElementById('input').value,
expression = "",
ptr = 0,
stack = []

while (ptr < str.length){
var currLexeme = lex(str,ptr)

if (currLexeme.type == "closeBracket"){
if (stack.length == 0)
expression = "Extra bracket at: " + (currLexeme.pointer - 1)
else
expression += "</" + stack.pop().func + ">\n"
+ "</mrow>"
ptr = currLexeme.pointer
} else if (currLexeme.type == "error"){
expression = "Cannot parse \"" + currLexeme.string
+ "\" at " + currLexeme.pointer
break
} else if (currLexeme.type == "func"){
expression += "<" + currLexeme.func + ">\n"
+ "<mrow>\n"
stack.push(currLexeme)
ptr = currLexeme.pointer
} else {
expression += markup (currLexeme)
ptr = currLexeme.pointer
}
}

if (ptr >= str.length && stack.length > 0)
expression = "Missing " + stack.length + " closing bracket/s."

expression = "<math xmlns='http://www.w3.org/1998/Math/MathML'>"
+ expression + "</math>"

document.getElementById('output').innerHTML = expression
}
</script>

关于javascript - Javascript 的 MathML 生成算法。任何推荐引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com