【问题标题】:Build parse tree with prolog使用 prolog 构建解析树
【发布时间】:2016-05-04 05:29:48
【问题描述】:

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

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

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

【问题讨论】:

  • dcg。纯 Prolog 关系可用于所有方向。这意味着一旦您描述列表与其解析树之间的关系,您就可以生成解析列表和树。从program(AST) --> ... 之类的 DCG 规则开始,描述抽象语法树和标记列表之间的关系。

标签: parsing prolog bison tokenize dcg


【解决方案1】:

遵循@mat 的建议,并使用您的令牌流语法,这是一个简单的示例。

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

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

您需要决定如何表示解析树。我选择了一种似乎很笨重的方式来将 n 元解析树表示为嵌入式列表(我没有考虑太多),但希望这能让您了解它是如何工作的。您的 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 叉树。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多