0

我正在尝试创建一种可以区分赋值表达式和显式赋值运算符的语法,例如

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 上发布了这个。

4

0 回答 0