用prolog构建解析树

时间:2016-05-04 05:29:48

标签: parsing prolog bison tokenize dcg

我正在尝试使用prolog编写解析器。 我有我的tokenizer,它返回令牌列表。例如: Tokens = [key(read),id('N'),sep(:=),int(10),....]我所需要的只是让prolog返回一组指令来运行程序。

program = [].
program = [Instructions | Program].

问题是,对于给定的令牌和语法(如bison),构建解析树的最简单方法是什么。我将不胜感激任何帮助。

1 个答案:

答案 0 :(得分:2)

跟进@ mat的建议,并使用您的令牌流语法,这是一个简单的例子。

假设您有以下BNF定义您的语言:

<program> ::= program begin <statement_list> end .
<statement_list> ::= <statement> | <statement> ; <statement_list>
<statement> ::= ...

您需要决定如何表示您的解析树。我已经选择了将n-ary解析树表示为嵌入式列表似乎是一种笨重的方式(我没有对它进行过多的考虑),但希望这会让你了解如何有用。您的DCG将直接反映BNF,参数将是解析树:

program([key(program), key(begin), AST_statement_list, key(end), sep(.)]) -->
    [key(program), key(begin)],
    statement_list(AST_statement),
    [key(end), sep(.)].

statement_list([AST]) --> statement(AST).
statement_list([AST_statement | AST_statement_list]) -->
    statement(AST_statement),
    statement_list(AST_statement_list).

statement(AST) --> ...

您可以使用令牌流调用DCG来解析:

phrase(program(ParseTree), TokenStream).

程序解析树看起来像:

[key(program), key(begin), [Statement1_List, Statement2_List, ...], key(end), sep(.)]

每个StatementN_List本身就是语句子树的n-ary树。