Prolog - 使用 DCG 解析函数
Prolog - parsing functions with DCG
我需要像这样解析表示函数的字符串:
<fsignature>"(" <term1>, <term2> ... <termn>")"
函数的签名和条款也必须进一步控制才能被接受。
我用 Prolog 写了这个 DCG:
fsign --> {is_leg(A)}, [A].
terms --> (funct, funct; terms).
terms --> (terms, terms; term).
term --> {is_term(T)}, [T].
但是当我尝试使用 phrase(funct, [foo, "(", a, a, ")"]) 时,它似乎不起作用。它进入溢出。 is_leg 仅检查字符串是否合法(以字符开头的字符串),而 is_term 应检查该术语是否为文字(常量、变量或函数)。
为什么它不起作用?我想,可能是变量——我应该把它们作为非终结符的参数吗?
感谢您的帮助。
如果你的表情都是这样的:
<fsignature> "(" <term1> <term2> ... <termn> ")"
然后用 DCG 写出来,它应该看起来像这样(减去您建议的任何字符串验证谓词):
expression --> fsignature, ['('], terms, [')'].
fsignature --> ... % whatever fsignature looks like
terms --> term. % "terms" is a single term, or...
terms --> terms, term. % ... more terms followed by a single term.
term --> ... % whatever a term looks like
你也可以把terms
的定义写成:
terms --> term | terms, term.
请注意,terms
的 non-recursive 定义出现在递归定义之前。此外,上面 terms
的定义假定您必须至少有一个术语(您的问题中未说明此要求)。
我需要像这样解析表示函数的字符串:
<fsignature>"(" <term1>, <term2> ... <termn>")"
函数的签名和条款也必须进一步控制才能被接受。 我用 Prolog 写了这个 DCG:
fsign --> {is_leg(A)}, [A].
terms --> (funct, funct; terms).
terms --> (terms, terms; term).
term --> {is_term(T)}, [T].
但是当我尝试使用 phrase(funct, [foo, "(", a, a, ")"]) 时,它似乎不起作用。它进入溢出。 is_leg 仅检查字符串是否合法(以字符开头的字符串),而 is_term 应检查该术语是否为文字(常量、变量或函数)。
为什么它不起作用?我想,可能是变量——我应该把它们作为非终结符的参数吗?
感谢您的帮助。
如果你的表情都是这样的:
<fsignature> "(" <term1> <term2> ... <termn> ")"
然后用 DCG 写出来,它应该看起来像这样(减去您建议的任何字符串验证谓词):
expression --> fsignature, ['('], terms, [')'].
fsignature --> ... % whatever fsignature looks like
terms --> term. % "terms" is a single term, or...
terms --> terms, term. % ... more terms followed by a single term.
term --> ... % whatever a term looks like
你也可以把terms
的定义写成:
terms --> term | terms, term.
请注意,terms
的 non-recursive 定义出现在递归定义之前。此外,上面 terms
的定义假定您必须至少有一个术语(您的问题中未说明此要求)。