Antlr4 如何使用ANTLR 4定义数组类型?
我目前正在用Antlr 4开发自己的语言DSL,我想知道是否可以定义一种数组类型,例如Antlr4 如何使用ANTLR 4定义数组类型?,antlr4,Antlr4,我目前正在用Antlr 4开发自己的语言DSL,我想知道是否可以定义一种数组类型,例如 fragment DIGIT : [0-9]; STRING : '"' ( ~ '"' )* '"' ; // match string content BOOLEAN: ('true' | 'fase'); INTEGER: DIGIT+ ; DOUBLE: DIGIT+ ('.' DIGIT+)*; // x = ["string","string2",...] ARRAY: ??? 您不会将数组定
fragment DIGIT : [0-9];
STRING : '"' ( ~ '"' )* '"' ; // match string content
BOOLEAN: ('true' | 'fase');
INTEGER: DIGIT+ ;
DOUBLE: DIGIT+ ('.' DIGIT+)*;
// x = ["string","string2",...]
ARRAY: ???
您不会将数组定义为令牌lexer规则,而是定义为解析器规则。您不会在数组中放入字符串、整数等,而是可以匹配字符串、整数等的表达式:
array
: '[' ( expression ( ',' expression )* )? ']'
;
expression
: expression ( '*' | '/' ) expression
| expression ( '+' | '-' ) expression
| ... all other kind of expressions ...
| STRING
| BOOLEAN
| INTEGER
| DOUBLE
| array
;
这样,阵列将匹配如下内容:
["text", 42, false, 1 + 2 * 3, [1, 2, 3]]
您不会将数组定义为令牌lexer规则,而是定义为解析器规则。您不会在数组中放入字符串、整数等,而是可以匹配字符串、整数等的表达式:
array
: '[' ( expression ( ',' expression )* )? ']'
;
expression
: expression ( '*' | '/' ) expression
| expression ( '+' | '-' ) expression
| ... all other kind of expressions ...
| STRING
| BOOLEAN
| INTEGER
| DOUBLE
| array
;
这样,阵列将匹配如下内容:
["text", 42, false, 1 + 2 * 3, [1, 2, 3]]
谢谢,实际上我想要一个包含值的数组相同类型,因此根据您的解决方案,我应该创建4个数组字符串数组、整数数组、布尔数组、双数组,是这样吗?当然,您可以为一种小型语言创建这些数组。@Belgacem您的数组不能包含变量、函数调用或从语法上看类型不明显的其他表达式吗?如果它们不能,那么是的,如果您有有限的类型,并且它们不能由用户定义,那么这是可能的。这并不意味着这是个好主意。首先,它意味着您必须为引入的每种新类型引入一种新类型的数组文本。还有数组的数组呢?另一个问题是,它会导致错误消息。一般来说,将类型检查留给类型检查器而不是试图在语法中对其进行编码几乎总是更明智的。谢谢,实际上我想要一个包含值的数组相同类型,因此根据您的解决方案,我应该创建4个数组字符串数组、整数数组、布尔数组、双数组,是这样吗?当然,您可以为一种小型语言创建这些数组。@Belgacem您的数组不能包含变量、函数调用或从语法上看类型不明显的其他表达式吗?如果它们不能,那么是的,如果您有有限的类型,并且它们不能由用户定义,那么这是可能的。这并不意味着这是个好主意。首先,它意味着您必须为引入的每种新类型引入一种新类型的数组文本。还有数组的数组呢?另一个问题是,它会导致错误消息。一般来说,将类型检查留给类型检查器而不是试图在语法中对其进行编码几乎总是更明智的。