MastarCpler开发日志(二)——用antlr4搞出parse树

参考:

-官方文件:

https://github.com/antlr/grammars-v4/blob/master/cpp/CPP14.g4

-《C++ Primer》第五版

-别人的总结

https://abcdabcd987.com/notes-on-antlr4/

过程:

Mx*语言结构

另外推荐一个挺好的在线画框图的网站:https://processon.com/

我认为基本用到的antlr4格式大概就是

name : content ;

用(AB)表示连结,(A|B)表示或,再结合正则表达式的表示方法如下:

  1. "+":出现1+次。
  2. "*":出现0+次。
  3. "?":出现1-次,或者将贪婪匹配(尽量向后匹配直到不能匹配)改为不贪婪匹配。
  4. ".":匹配除换行符 \n 之外的任何单字符。

我感觉已经够用了。需要进一步参考的话请戳:


antlr4语法规则有这样三类:

  1. Parser rule (non-terminal),该规则命名开头应小写。
  2. Lexer rule (terminal),该规则命名开头应大写。
  3. fragment,给Lexer规则中的公共部分命名。

需要注意的是,如果规则有冲突,则先出现的先匹配。当然还有很多其他的,但我暂时没有用到。

然后比较重要的就是“statement”和“expression”了。

statement
:
	compoundStatement
	| expressionStatement
	| conditionalStatement
	| iterativeStatement
	| jumpStatement
	| nullStatement
	| varDefStatement
;

这是statement,那个compoundStatement指的是语句块,即 { ... } 。

优先级 运算符 描述 结合性
1 :: 作用域解析 从左到右
2 a++   a-- 后缀自增与自减
type()   type{} 函数风格转型
a() 函数调用
a[] 下标
.   -> 成员访问
3 ++a   --a 前缀自增与自减 从右到左
+a   -a 一元加与减
!   ~ 逻辑非逐位非
(type) C 风格转型
*a 间接(解引用)
&a 取址
sizeof 取大小[注 1]
new   new[] 动态内存分配
delete   delete[] 动态内存分配
4 .*   ->* 指向成员指针 从左到右
5 a*b   a/b   a%b 乘法、除法与余数
6 a+b   a-b 加法与减法
7 <<   >> 逐位左移与右移
8 <=> 三路比较运算符(C++20 起)
9 <   <= 分别为 < 与 ≤ 的关系运算符
>   >= 分别为 > 与 ≥ 的关系运算符
10 ==   != 分别为 = 与 ≠ 的关系运算符
11 a&b 逐位与
12 ^ 逐位异或(排除或)
13 | 逐位或(包含或)
14 && 逻辑与
15 || 逻辑或
16 a?b:c 三元条件[注 2] 从右到左
throw throw 运算符
= 直接赋值( C++ 类默认提供)
+=   -= 以和及差复合赋值
*=   /=   %= 以积、商及余数复合赋值
<<=   >>= 以逐位左移及右移复合赋值
&=   ^=   |= 以逐位与、异或及或复合赋值
17 , 逗号 从左到右

摘自zh.cppreference.com/w/cpp/language/operator_precedence

expression需要根据这个运算符优先级一级一级展开。

最后参考官方文件,加上一些忽略空格、换行和注释:

Whitespace
:
	[ \t]+ -> skip
;
Newline
:
	(
		'\r' '\n'?
		| '\n'
	) -> skip
;
BlockComment
:
	'/*' .*? '*/' -> skip
;
LineComment
:
	'//' ~[\r\n]* -> skip
;

就大功告成了。

写完MxStart.g4以后用以下命令运行:

antlr4 MxStar.g4
javac MxStar*.java
grun MxStar <RULE> -gui or -tree

-tree和-gui会以不同的方式显示parse树。

不会用IntelliJ的情况下,暂时可以用命令行。

IntelliJ配置:

为了跑ANTLR4,还要加上:https://blog.csdn.net/sherrywong1220/article/details/53697737

这里有对pom.xml文件的讲解:https://blog.csdn.net/u012152619/article/details/5148529

如果文件输入,注意默认当前目录是在project的根目录下面。

猜你喜欢

转载自blog.csdn.net/u011431896/article/details/79818773