antlr4-核心符号(二)

符号

语言的本质都是一样的,他们都具有各种表达式。下图是antlr的作者总结的antlr的核心语法符号,大部分语言都是其中一种或者多种。

通用语言模式

序列

这是一个有限的或者循环的长序列符号或者子句。例如包含变量声明(输入在标识符后面)和整形列表。
下面是一些例子:

x y ... z // x followed by y, ..., z
'[' INT+ ']' // Matlab vector of integers

带终止符的序列

这是一个被符号分离的循环的序列符号或者子句。这个符号通常是分号或者新行。
例如python以新行结束,java以分号结束。

(statement ';' )* // Java statement list
(row '\n')* // Lines of data

带分离符的序列

这是一个非空的长序列。通常被标识符,逗号,分号或者周期性的分离。

expr (',' expr)* // function call arguments
( expr (',' expr)* )? // optional function call arguments
'/' ? name ('/' name)* // simplified directory name
stat ('.' stat)* // SmallTalk statement list

可选

这是一系列可选的短语。
例如包含不同种类的类型,语句,表达式,或者xml标签。

type : 'int' | 'float' ;
stat : ifstat | whilestat | 'return' expr ';' ;
expr : '(' expr ')' | INT | ID ;
tag : '<' Name attribute* '>' | '<' '/' Name '>' ;

符号依赖

一个标准符的存在要求更多的标准符。
例如(),{},等。

'(' expr ')' // nested expression
ID '[' expr ']' // array index
'{' stat* '}' // statements grouped in curlies
'<' ID (',' ID)* '>' // generic type specifier

嵌套语句

这是一个自相似性的语言结构。例如表达式,嵌套java类,嵌套的代码块,和嵌套的python功能定义等。

expr : '(' expr ')' | ID ;
classDef : 'class' ID '{' (classDef|method|field) '}' ;