Dart PetitParser 获取使用 ExpressionBuilder 创建的 AST 数据结构
Dart PetitParser to get at AST datastructure created with ExpressionBuilder
我是 petitparser 的新手,但它看起来像是解析器的声波螺丝刀。
对于我的第一个项目,我正在构建代码来解析一个简单的表达式,该表达式构建我的 Node 对象的 AST 树,然后使用一些规则遍历该树以最小化不需要的括号。我不知道将什么传递给 .parse() 的输出(似乎是一个结果)来访问我定义的树,所以我可以在 AST 的顶部调用 .visit() 。有什么想法吗?
class RIPParser {
Parser _make_parser() {
final builder = ExpressionBuilder();
// precedence 5
builder.group()
..primitive(digit()
.plus()
.seq(char('.').seq(digit().plus()).optional())
.flatten()
.trim()
.map((a) => Node(precedence: 5, value: a)))
..wrapper(char('(').trim(), char(')').trim(),
(l, a, r) => Node(precedence: 5, left: l, value: a, right: r));
// negation is a prefix operator
// precedence 4
builder.group()
..prefix(
char('-').trim(), (op, a) => Node(precedence: 4, value: '$op$a'));
// power is right-associative
// precedence 3
builder.group()
..right(char('^').trim(),
(a, op, b) => Node(precedence: 3, left: a, value: op, right: b));
// multiplication and addition are left-associative
// precedence 2
builder.group()
..left(char('*').trim(),
(a, op, b) => Node(precedence: 2, left: a, value: op, right: b))
..left(char('/').trim(),
(a, op, b) => Node(precedence: 2, left: a, value: op, right: b));
// precedence 1
builder.group()
..left(char('+').trim(),
(a, op, b) => Node(precedence: 1, left: a, value: op, right: b))
..left(char('-').trim(),
(a, op, b) => Node(precedence: 1, value: op, left: a, right: b));
final parser = builder.build().end();
return parser;
}
Result parse(String input) {
var parser = _make_parser();
var result = parser.parse(input);
return result;
}
我是 petitparser 的新手,但它看起来像是解析器的声波螺丝刀。
对于我的第一个项目,我正在构建代码来解析一个简单的表达式,该表达式构建我的 Node 对象的 AST 树,然后使用一些规则遍历该树以最小化不需要的括号。我不知道将什么传递给 .parse() 的输出(似乎是一个结果)来访问我定义的树,所以我可以在 AST 的顶部调用 .visit() 。有什么想法吗?
class RIPParser {
Parser _make_parser() {
final builder = ExpressionBuilder();
// precedence 5
builder.group()
..primitive(digit()
.plus()
.seq(char('.').seq(digit().plus()).optional())
.flatten()
.trim()
.map((a) => Node(precedence: 5, value: a)))
..wrapper(char('(').trim(), char(')').trim(),
(l, a, r) => Node(precedence: 5, left: l, value: a, right: r));
// negation is a prefix operator
// precedence 4
builder.group()
..prefix(
char('-').trim(), (op, a) => Node(precedence: 4, value: '$op$a'));
// power is right-associative
// precedence 3
builder.group()
..right(char('^').trim(),
(a, op, b) => Node(precedence: 3, left: a, value: op, right: b));
// multiplication and addition are left-associative
// precedence 2
builder.group()
..left(char('*').trim(),
(a, op, b) => Node(precedence: 2, left: a, value: op, right: b))
..left(char('/').trim(),
(a, op, b) => Node(precedence: 2, left: a, value: op, right: b));
// precedence 1
builder.group()
..left(char('+').trim(),
(a, op, b) => Node(precedence: 1, left: a, value: op, right: b))
..left(char('-').trim(),
(a, op, b) => Node(precedence: 1, value: op, left: a, right: b));
final parser = builder.build().end();
return parser;
}
Result parse(String input) {
var parser = _make_parser();
var result = parser.parse(input);
return result;
}