有缺陷的方法
:我尝试过的一种方法是强制一行中两个以上的变量|抽象的匹配,然后左键应用它们
APP_2
= lhs:ABSTRACTION_OR_VARIABLE rhs:ABSTRACTION_OR_VARIABLE
{
return Application(location(), lhs, rhs, false, "APP2")
}
APP_3
= lhs:APP_2 rhs:TERM
{
return Application(location(), lhs, rhs, false, "APP3")
}
APPLICATION_WO_PARENS
= APP_3
/ APP_2
{
"expr": "lmno",
"ast": "Application::APP3(
Application::APP2( Variable(l), Variable(m) ),
Application::APP2( Variable(n), Variable(o) )
)"
}
所以我可以建立任何数量的应用程序。。。APP_99规则并强制左边的应用程序。在我超过99份(或其他)申请之前,这是可行的。解决方案将是一个真正的黑客和脆弱的。
:我想把一些东西拼凑在一起,于是改变了将一系列术语作为应用程序进行匹配的方法:
APP_ARR
= terms:ABSTRACTION_OR_VARIABLE*
{
return reduceTerms(location(), terms)
}
APPLICATION_WO_PARENS
= APP_ARR
这种方法要求我编写一些代码来构建我试图避免的结构(reduceTerms)。代码如下:
const reduceTerms = function(info, terms){
const initialLhs = terms.shift()
const initialRhs = terms.shift()
const initialApp = Application(info, initialLhs, initialRhs, false, 'reduceTerms')
const appAll = terms.reduce(
(lhs, rhs) => Application(info, lhs, rhs, false, 'reduceTerms'),
initialApp
)
return appAll ;
}
请忽略布尔和“reduceTerms”字符串。布尔值用于指示此应用程序是否包含在parens中(在本书稍后的部分中遇到parens概念之前,将删除它)。字符串是关于如何/在何处构造应用程序节点的实例的标签(用于调试解析器如何应用规则)。
条款
阵列。还原函数将以初始对象作为
下学期
右手侧
工作
{
"expr": "lmno",
"ast": "Application::reduceTerms(
Application::reduceTerms(
Application::reduceTerms( Variable(l), Variable(m) ),
Variable(n) ),
Variable(o) )"
}
这里的一个问题是我需要做一些额外的工作
信息
对象以准确反映匹配。在这个版本中
信息
因此,我仍然在寻找一个解决方案,在PEG内部执行此操作,而不在数组上进行匹配,并将其还原为一棵树。
:使用发布的方法翻译
A -> A α | β
到
A -> β A'
A' -> α A' | ε
我已经知道了
TERM_OR_VARIABLE
= L_PARENS TERM R_PARENS
/ VARIABLE
APP
= lhs:TERM_OR_VARIABLE rhs:APP_
{
return Application(location(), lhs, rhs, false, "APP")
}
APP_
= lhs:TERM_OR_VARIABLE rhs:APP_
{
return Application(location(), lhs, rhs, false, "APP_")
}
/ lhs:TERM_OR_VARIABLE END
{
return lhs
}
/ END
END
= !.
APPLICATION_WO_PARENS
= APP
lmno公司
Application::APP(
Variable(l),
Application::APP_(
Variable(m),
Application::APP_(
Variable(n),
Variable(o)
)
)
)