参考:
-官方文件:
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+次。
- "*":出现0+次。
- "?":出现1-次,或者将贪婪匹配(尽量向后匹配直到不能匹配)改为不贪婪匹配。
- ".":匹配除换行符 \n 之外的任何单字符。
antlr4语法规则有这样三类:
- Parser rule (non-terminal),该规则命名开头应小写。
- Lexer rule (terminal),该规则命名开头应大写。
- 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的根目录下面。