我不熟悉函数式编程,并且很难为每个循环找出一个简单的函数。
我手头有这个,我需要在xsl中使用相同的算法。
let the input be a string S consisting of n characters: a1 ... an.
let the grammar contain r nonterminal symbols R1 ... Rr.
This grammar contains the subset Rs which is the set of start symbols.
let P[n,n,r] be an array of booleans. Initialize all elements of P to false.
for each i = 1 to n
for each unit production Rj -> ai
set P[i,1,j] = true
for each i = 2 to n -- Length of span
for each j = 1 to n-i+1 -- Start of span
for each k = 1 to i-1 -- Partition of span
for each production RA -> RB RC
if P[j,k,B] and P[j+k,i-k,C] then set P[j,i,A] = true
if any of P[1,n,x] is true (x is iterated over the set s, where s are all the indices for Rs) then
S is member of language
else
S is not member of language
我能够做一些但是我感到困惑并且走错了路。
我了解到我不能拥有像数组这样的东西。即使我创建一个像数组一样的变量,我也无法更新它。
所以我开始做一些递归(通过调用模板),但我仍然在想它是否是正确的方法。如果还有另一个为什么要实现为每个嵌套而没有递归的原因..
答案 0 :(得分:0)
在XSLT中,如果您避免使用xsl:for-each
,则会更好。
您可能希望看到我在2007年实施的XSLT 2.0中完全编写的一般LR(1)解析器。它是 FXSL 的一部分,可在此处查看:http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/func-lrParse.xsl?view=markup
我写过两个非常复杂的解析器,一个用于JSON(参见http://fxsl.cvs.sourceforge.net/viewvc/fxsl/fxsl-xslt2/f/func-json-document.xsl?revision=1.11&view=markup)
另一个更复杂的是XPath 2.0(语法有209条规则)。
基本工具是修改后的YACC,它将特定LR(1)语法的解析表生成为XML文档。然后将它们与输入字符串一起馈送到通用LR(1)解析器的XSLT实现。