【发布时间】:2018-04-05 00:16:41
【问题描述】:
所以我正在尝试转换一种在编程语言中定义变量定义的语法。这是我的第一个序言,它与典型的语言非常不同,所以我很困惑。语法如下:
S -> T S | T
T -> char F 分号 | int F 分号
F -> 标识 |身份证号
G -> 逗号 F
对于“char id semicolon”或“int id comma id semicolon char id semicolon”之类的东西,它会有效地返回true。
我试图把它变成一个序言程序来识别这个语法。到目前为止我所拥有的是:
type([char|T],T).
type([int|T],T).
def([id|T], T).
com([comma|T], T).
semi([semicolon|T], T).
vardef(L,S) :-
type(L,S1),
def(S1,S2),
comma(S2,S3),
def(S3,S4),
semi(S4,S).
variable_definition(L) :-
vardef(L,[]).
但是,这显然只识别特定的“int/char id comma id semicolon”。我不知道如何制作它,所以它在分号之前有一个可变数量的“id comma id”,甚至在第一个之后有一个全新的变量定义。这个网站上关于同一件事的其他问题通常必须处理像这样设置的语法,而不是可以有可变数量输入的语法。
编辑:所以问题是双重的。首先,我如何让它识别两个不同的变量定义,一个接一个。我假设我必须更改最后一行才能完成此操作,但我不确定如何。
其次,如何让它识别可变数量的“id”,后跟逗号。所以如果我想让它识别“char id semicolon”以及“char id comma id semicolon”。
【问题讨论】:
-
什么是
TS?使用这种实现方法,您需要使用递归来识别可变数量的 id 后跟逗号。您是否考虑过使用 DCG,这对于此类程序来说是理想的? -
TS 是一个 T 后跟一个 S,请在它们之间添加一个空格。我没有使用 DCG 的原因是我们在我正在上课的课程中还没有达到目标,所以我不想继续前进,并可能因为没有使用所提供的系统而被降级