我正在尝试创建一种可以区分赋值表达式和显式赋值运算符的语法,例如
T1=1
和一个隐式赋值,比如
T1
其中,显式赋值的变量名可以有尾随数字,而隐式赋值的变量名不能,即前者应将 1 分配给 T1,后者应将 1 分配给 T。
我想出了以下简单的语法:
module.exports = grammar({
name: 'test',
rules: {
root: $ => repeat($.a),
a: $ => choice($.i, $.e),
i: $ => seq($.s, $.n),
e: $ => seq($.sn, '=', $.n),
s: $ => /[A-Z]+/,
sn: $ => /[A-Z]+[0-9]*/,
n: $ => /[0-9]+/
}
});
这适用于这些测试用例
T 1
T1=1
T1 = 1
但不适合
T1
或者
T=1
这是我正在使用的测试文件:
====================================
works
====================================
T 1
T1=1
T1 = 1
---
(root
(a (i (s) (n)))
(a (e (sn) (n)))
(a (e (sn) (n))))
====================================
e1) doesn't work
====================================
T1
---
(root (a (i (s) (n))))
====================================
e2) doesn't work either
====================================
T=1
---
(root (a (e (sn) (n))))
====================================
e1) results in
(root (ERROR (sn)))
and
e2) in
(root (a (i (s) (ERROR) (n))))
====================================
我试图修补优先级,fe 给 $.ia 更高的数字,但到目前为止没有任何帮助。我不认为语法是模棱两可的,但也许我只是看不清楚?
是否可以用 tree-sitter 来表达这样的语法?
我也在GH 上发布了这个。