我正在尝试使用prolog编写解析器。
我有我的tokenizer,它返回令牌列表。例如:
Tokens = [key(read),id('N'),sep(:=),int(10),....]
我所需要的只是让prolog返回一组指令来运行程序。
program = [].
program = [Instructions | Program].
问题是,对于给定的令牌和语法(如bison
),构建解析树的最简单方法是什么。我将不胜感激任何帮助。
答案 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树。