���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

��璇绘��绯诲����绔�广大�������娈��风��澶磋��椋��达�澶у�跺��濂藉��澶�河渠�����

�����������村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷���绯诲����绔���绗�1绡�����绯诲����绔���涓昏���������澶у�跺��浼�濡�浣�浠��跺�彭�璁捐�′�绉�缂�绋�璇�瑷�锛�marvel璇�瑷�锛�锛�骞朵娇��marvel璇�瑷�寮���涓�河渠���疏浚���椤圭��锛�濡�绉诲��App��Web搴��ㄧ����marvel璇�瑷���浠ラ��杩�涓���3绉��瑰�杩�琛�锛�

  1. 瑙i���ц�
  2. 缂�璇���Java Bytecode锛��╃��JVM�ц�
  3. 缂�璇���河渠�杩��舵��浠讹����版�ц�锛��轰�LLVM锛�

��绯诲����绔�疏浚��扮演��marvel璇�瑷�骞朵���寰�澶�����宸卞�ㄦ����绯诲��涓��凤���涓�涓��╁�枫��marvel璇�瑷���涓�涓�宸ヤ�绾х��缂�绋�璇�瑷�锛�涓�kotlin��Java绛�璇�瑷�����涓�涓�绾у��锛�璁捐�′�����涓轰�璇�楠�缂�绋�璇�瑷����扮演�规�с����浠��㈤��寮�����瓒�骞冲�板���绯荤�UnityMarvel��稳定���Ori璇�瑷����ㄥ���规�т����ユ�河渠�Marvel���充�UnityMarvel��缁�������浼�涓��ㄥ����绔�浠�缁���杩�����璁ㄨ�雾�璇��ㄧ����棰���

1. 濡���绯荤�潘�浠跺���板�剁害锛���娌℃�����界���洪���村��锛�

��浠��ラ��锛��板�ㄤ腑缇�璐告����濡���濡��硷����戒互��浣跨�ㄥ�藉�寰�澶�潘�浠讹�广大ゅ�舵��绯荤�潘�浠讹��戒���涓�河渠���棰���杩�广大遍��瑕���浠��ㄤ�河渠��抽��棰�������宸卞��浠ユ�у�剁��������潘�浠讹�岛�濡�锛���浣�绯荤���缂�绋�璇�瑷����版��搴���绉�海洋�璁$��潘�浠剁�����跺��杩�河渠�绉�绫荤��潘�浠朵腑锛�澶у��藉�河渠��雾�潘�浠讹�������浣�绯荤���缂�绋�璇�瑷�锛�浠ュ���稿�崇��IDE锛���浠ョО涓烘��绯荤�潘�浠躲��

杩�����璇磋�村�雾�潘�浠跺��绯荤�潘�浠剁���哄�����雾�潘�浠舵����寰�澶�潘�浠堕�戒�璧���潘�浠讹�岛�濡�锛�娴�琛���绋�搴�搴�锛�濡�tensorflow��pytorch绛�锛����版��搴�锛�濡�MySQL��Oracle绛�锛���浣�澶у��板�雾�潘�浠剁��涓�涓��卞���圭�规�������′��瑰��棰���锛�岛�濡�锛�浣�涓����界��MySQL寮���涓�娆炬父��锛�涔�涓����界��tensorflow寮���绉诲��App�����ㄥ�雾�潘�浠朵腑��涓�广大�绫伙�疏浚�浠������ㄧ��锛���涔�����河渠���涓�棰���锛���浠�广大�杩�绫昏蒋浠剁О涓虹郴缁�潘�浠躲��疏浚�浠����翠釜IT棰������雾��舵����娌℃��疏浚�浠�锛��翠釜IT棰���广大�涓�澶�海洋��ㄣ��岛�濡�锛�����锛�������浣�绯荤���缂�璇��ㄧ����杩�涓や锅�瑰���澶у�跺��浠ユ�虫�规划�娌℃��河渠��崇郴���版��搴�锛�杩����朵�绫诲�����版��搴���浠ヤ娇��锛�娌℃��河渠�tensorflow锛�IT棰���涔�涓�浼���姝㈣�潘���浣�娌℃��河渠�Windows��macOS��Linux��C璇�瑷���Java璇�瑷�杩�河渠�����锛�涓���广大�浼����凤�广大�浼����伴�����板伐涓������朵唬�� ��浠ョ郴缁�潘�浠舵���雾�潘�浠剁��涓�涓�海洋���锛���涓�蹇�涓���广大���濡���广大��雾�潘�浠跺���朵�潘�浠舵��浣�����锛��d�绯荤�潘�浠跺氨�����搞��

�ㄧ郴缁�潘�浠朵腑锛�缂�璇��ㄦ����疏浚规��绐��寸������涓虹�璇���锛�缂�绋�璇�瑷�锛��������告����浣�绯荤��ヨ�达��村�规��寤虹����杩�����涓虹������寰�澶������哄��浠ラ���╋�岛�濡�锛���甯哥�ㄧ����JVM锛�褰��讹�杩���寰�潘���.net core绛������� 濡�����浠���缂�绋�璇�瑷���浠ュ�轰�JVM锛��d�广大辨���崇����浠ュ�╃��Java璇�瑷�����������锛�濡�����浠���缂�绋�璇�瑷���浠ョ�ㄦ�村�规�����瑰�璋��ㄥ�朵�璇�瑷�锛�濡�C++��Go绛�锛�锛��ㄦ��绉�绋�搴�涓�锛�涔�广大卞��浠ョ�存�ヤ娇�ㄨ�河渠�缂�绋�璇�瑷���������褰��讹�杩����村��杩���瓒���������锛�UnityMarvel��Ori璇�瑷�姝f���轰�瓒�����������锛�锛��讳�锛�浣�涓轰�绉��扮演��缂�绋�璇�瑷�锛��╃�ㄥ�朵�����������寤�浠风���瑰�锛�褰��讹��ㄨ��瑷���灞���杩�绋�涓�锛�涔���浠ラ��娓�寤虹����宸辩������锛��稿�河渠�楠�椹存�鹃┈锛�锛�杩�涔���涓�绉�绛��ャ����浠ュ����崇���达�缂�璇���锛�缂�绋�璇�瑷�锛�����疏浚规����涓�涓���褰��讹�濡����ユ����宸卞��浠ユ�у�剁��缂�绋�璇�瑷�锛���浠ヤ负��������浣�绯荤���岛����达�岛�濡�锛��╃�ㄨ���������锛��ㄥ缓绔��版��浣�绯荤�涔���锛�广大变负璇ユ��浣�绯荤�����寤虹������锛�杩�涓��逛互��涓��ㄦ�版����杩股���

2. 寮���缂�绋�璇�瑷���瑕���河渠��ヨ��

�板�ㄨ��ュ�版���抽�����ㄥ��河渠�锛�寮���涓�绉�缂�绋�璇�瑷��板���瑕���河渠��ヨ����锛��跺����瑕����ヨ��杩�����澶��������雾���瑕�姹���蹇�椤昏�冲�浼�涓�绉�缂�绋�璇�瑷���濡�C��C++��Java��C#��Go��Python绛���褰��讹��ㄨ��浼�3绉�浠ヤ���缂�绋�璇�瑷�锛���涓烘��浠����ㄨ�捐�$�绋�璇�瑷�锛�涓����ㄨ�捐�℃������潘�浠躲���ㄨ�捐�$�绋�璇�瑷��讹���瑕�杩�琛�妯���姣�杈�锛�涔�广大辨����瑕������朵���缂�绋�璇�瑷�锛���涓轰换浣��版�����戒�����100%疏浚��ㄥ��绌轰骇��锛�杩�河渠��版�����戒���澶���广大��扮演��涓��朵���绫绘������褰卞��锛�缂�绋�璇�瑷�涔�涓�岛�澶���岛�濡�锛�UnityMarvel��稳定���Ori璇�瑷�广大辨������河渠��板��绉�缂�绋�璇�瑷�锛�浠ュ�����ヤ���宸辩���版��������缁�褰㈡������

�や�瑕�河渠�瑙eぇ����缂�绋�璇�瑷�澶�锛�杩���寰�澶�涓�涓��℃���崇���ヨ����瑕����°��涓昏����ヨ��缁���锛�涓�浠�浠�杩�河渠�锛����㈢�ㄥ�颁���璇�缁�璁诧�濡�涓�锛�

锛�1锛�河渠�瑙eぇ����缂�绋�璇�瑷�锛��ㄨ��3绉�浠ヤ�锛�
锛�2锛�缂�璇��������雾��ヨ��
锛�3锛�绠�娉��藉��
锛�4锛�缂�璇��ㄥ��绔�������
锛�5锛�海洋�涔��藉��
锛�6锛��宠薄��

广大界�″���缂�绋�璇�瑷�骞朵�浼���澶у��海洋���缂�璇�����涓��蜂�0寮�彭�����涓�涓�缂�璇���锛�浣�缂�璇��������雾��ヨ��杩���瑕����$��锛�涓�河渠�瑙g�璇���������海洋�锛�璧剁揣涓�B绔���瑗跨��瑙�棰���娌圭�″�昏ˉ璇撅�������涔�浼�缁���marvel璇�瑷����稿�崇��瑙�棰�璇剧�锛�澶у�跺��浠ュ�虫敞��锛�

绠�娉�广大变�蹇�璇翠�锛�缂�璇��ㄩ���㈠���ョ����绉�绠�娉�锛�缂�璇��ㄧ��绠�娉�瀵�搴���涔�瓒�杩�河渠�缁�澶у��板��ㄣ��浠讳�褰㈠���绠�娉��藉���芥����起����雾����版��缁���蹇�椤绘���★��朵���绠�娉�锛��藉��澶�广大�广大卞��澶�广大�锛�澶�澶�������杩�涓�娌℃���哄������绋�锛�涔�����瑕�涓����ㄥ��璺典腑瀛�涔���

寮���缂�璇��ㄧ���烘��姝ラ�ゅ�涓��炬��绀恒��

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

兄弟���璇存��涓��戊寅�骞朵���������缂�璇��ㄩ�戒弗�兼���ц�河渠�姝ラ�よ�琛�锛������戒�广大�澶�涓�姝ラ�ゅ����涓�涓�姝ラ�わ�岛�濡�锛�璇�娉�������璇�涔���������涓�姝ワ�����杈���AST锛�锛�涔������藉�涓�姝ュ����澶�涓�姝ラ�わ�������澧���涓�河渠�涓�涓��$�稿�崇��姝ラ�ゃ��

瀵逛�宸ヤ�绾х�璇��ㄦ�ヨ�达�骞朵�浼�浠�0寮�彭�疏浚��拌��娉���璇�娉�������锛�骞朵���杩�涓�瑗挎��澶��撅�����濡���疏浚��ㄦ��宸ョ���浠g��锛�瑕�娣诲����淇��逛�涓��拌��娉�锛��g���村氨��涓��哄�╂��锛���涓鸿�淇��归��甯稿����版�戊寅���涓�涓����洪��锛���甯镐�濂芥�惧����锛���涓轰唬��杩�河渠�澶���锛����变�璇�娉�������璇�娉�������瑙�寰���寰�锛���浠ュ�雾�颁�寰�澶���杩���娉�����璇�娉������ㄥ��璇�娉������ㄧ��宸ュ�凤��变�璇�娉�����涓�璇�娉�������缂�璇��ㄥ��绔�����瑕�缁����ㄥ��锛���浠ヨ�绫诲伐�烽��甯哥О涓衡��缂�璇��ㄥ��绔������ㄢ����姣�杈�����������lex��yacc��javacc��antlr绛����朵腑lex��涓��ㄧ�ㄦ�ョ����璇�娉������ㄧ��锛�yacc�ㄦ�ョ����璇�娉������ㄧ��锛�javacc��浠ュ���剁����璇�娉���璇�娉������ㄣ��antlr涔����山��浠ョ����璇�娉������ㄥ��璇�娉������ㄣ��涓�杩�lex��yacc������C璇�瑷�锛�javacc������Java璇�瑷�����antlr����澶�绉�缂�绋�璇�瑷�锛�岛�濡�Java��C++��JavaScript��Go��C#��Swift绛�����绯诲����绔�涔�浣跨�ㄤ�antlr�����扮演����antlr4�ュ���扮演�璇��ㄧ����绔�锛�璇�娉������ㄥ��璇�娉�������锛���

杩���绉�宸ュ�烽�芥��岛�璧�河渠���娉�����璇�娉������ㄥ��璇�娉������ㄧ��锛�岛�濡�锛���antlr4涓�锛�濡���瑕�璇�������涔��ゅ����杩�绠�锛�����瑕�缂���涓��㈢����娉��冲����

expr:   expr op=('*'|'/') expr     
    |   expr op=('+'|'-') expr  

��娉���涓���寰�绠�����锛�浣�濡���瑕�缂���疏浚�����浠g��锛����介��瑕�涓��捐����藉���起���浠��㈤��疏浚��扮演��Ori璇�瑷�锛��╃��antlr4������璇�娉���璇�娉�������锛��诲��6涓�琛�Go璇�瑷�浠g��锛���浠���宸辩���河渠�澶ф�4涓�琛�Go浠g��锛��翠釜缂�璇��ㄦ��瓒�杩�10涓�琛�浠g��锛�3/5�����ㄧ������锛�2/5����宸辩�����锛�����涓���娉�杩���璇�河渠�浼���绾э�antlr4瑙�疏浚�锛����ㄥ���㈢����娉���浼���绾ч��河渠����ㄥ���㈢����娉���浼���绾с����浠��ラ��锛�瀵逛�����杩�绠��ヨ�达�����涔��わ�������锛���浠�expr op=('*'|'/') expr 搴�璇ュ��expr op=('+'|'-') expr ����锛���杩��ユ��涓�琛�河渠���濡���瑕����村�����杩�绠�锛�岛�濡�锛�骞虫�无边��寮��无边��骞�绛�锛�����瑕�淇��硅�涓���娉��冲��锛���涓���寰�绠�����锛�

���㈣�寸����4�规��纭��ヨ��锛�涔���寰�澶���绋���浠ュ��涔�锛�浣�����涓ょ�戊寅�海洋�涔��藉�����宠薄��锛�广大辫�疏浚��ㄩ����宸辩��澶╄�河渠�����涓哄����4�硅�借�╀����轰�涓�����杩�涓�����缂�璇���锛�浣�����涓ょ�硅�藉�冲��浣�����缂�璇��ㄦ��澶�寮哄ぇ��

疏浚��颁�涓�缂�绋�璇�瑷�锛���娑����扮演���ヨ��瑕�姣�疏浚��扮演�璇��ㄩ�惧害�村ぇ����涓哄���疏浚��扮演�璇���锛�骞朵���宸茬�海洋��ㄧ��缂�绋�璇�瑷�锛��变�璇�娉�宸茬�纭�疏浚�锛���浠ュ����瑕�疏浚��板�烘�ュ�冲����浣�缂�绋�璇�瑷�涓���锛�涓�����瑕����拌�捐�★�广大ゅ�舵���ㄦ����版�拌��娉��讹���甯稿�伴�撅���瑕�河渠�瑙g���ヨ���稿�澶�锛���浠ラ��瑕��ユ��蹇���海洋�涔��藉��锛���浠ュ�ㄧ���堕�村��海洋�浼�骞舵���′换浣��ヨ������������澶�锛��宠薄���拈��瑕�锛���涓鸿�捐�′�娆炬�扮演��缂�绋�璇�瑷�锛���河渠�涓�瑗垮���戒�浠�浠�灞���河渠�IT棰���锛�涔�涓�浠�浠�灞���河渠���宸辨��浠�河渠�������棰���锛�岛�濡�����Ori璇�瑷�涓�锛��ユ��涓�河渠����扮演��璇�娉�锛���瑕����堕��搴�绫讳技JavaScript����绾跨�妯″���Java��澶�绾跨�妯″�����姝わ��ユ��澶�缁村害���宠薄��������缁���寰����╃���抽����

3. ��宸辫�捐�$��缂�绋�璇�瑷�浼�娴�琛���

��缁�甯稿�ㄧ�涓����板�澶���海洋��ㄩ��锛�涓轰�涔�涓��芥病����宸辨�琛���缂�绋�璇�瑷�锛�广大界�℃����璇�瑷�锛�浣��变���涓���缂�绋�锛���浠ユ拓宽瀹�涓�浼��ㄧ��娴�琛�锛��藉��涔�骞朵�绠�娴�琛�锛���锛�BAT绛�澶у��涓轰�涓�寮���涓�涓���锛� �跺����河渠哄��绛�锛�寮���缂�绋�璇�瑷�疏浚规��锛��抽��������锛�杩���河渠哄��绛�锛�BAT����涓烘病��蹇�瑕�锛���涓虹�绋�璇�瑷�娌℃����KPI���╋�涔���河渠�河渠哄��绛�锛�寮���涓�娆剧�绋�璇�瑷�锛���璧锋�ュ��俱�� �跺��杩�河渠��藉���芥������锛�浣�涓昏������跺��广大辨����姹�娌℃��涓�琛��ㄦ���╋�����璇达��板�ㄧ��缂�绋�璇�瑷�宸茬�瓒冲�婊¤冻��姹�河渠�锛�娌℃��蹇�瑕���寮���涓�娆炬�扮演��缂�绋�璇�瑷�锛���涓�杩�河渠�澶у�������╁�����藉�澶э�褰��讹�杩�������绉�绱�����棰���

�跺��缂�绋�璇�瑷���寰�澶�绉�锛���涓�绉�广大辨����Java��C#��C++涓��风�����ㄧ�绋�璇�瑷�锛�杩�绫昏��瑷�浠�涔��借�藉��锛���涓�绉��剧�靛��澶���缂�绋�璇�瑷���杩�����澶�涓�绉�缂�绋�璇�瑷�锛�濡�SQL��VBA��ABAP锛�SAP����稳定�璇�瑷�锛�锛�杩�绫诲�河渠�棰���缂�绋�璇�瑷�锛�浠�浠�涔����芥���剧�靛��澶���锛�涔����戒����剧�靛��澶�������甯镐娇�ㄨ�绫荤�绋�璇�瑷�疏浚�����河渠��瑰����宸ヤ�锛�濡�SQL��浣��版��搴�锛�VBA��浣�Office��ABAP��浣�SAP�版��绛����跺���ㄥ�藉����寰�澶����稿���ㄥ凡缁���岛�河渠�绫讳技��棰���璇�瑷�锛�������甯镐�涓�锛����藉��涓�锛�缁�澶у��颁汉涓�娓�妤���宸层��

�充���宸卞����烘�ョ��缂�绋�璇�瑷�����浼�娴�琛�锛��跺��浣�浠��冲お澶�河渠���缂�绋�璇�瑷���涓轰�瑙e�冲������棰���海洋��ㄧ��锛�涓���涓轰�娴�琛���海洋��ㄧ����广大卞��琛f��锛��������ㄩ����涓轰�淇���锛���涓����跺�锛�褰�澶у��颁汉�戒娇�ㄨ��宸辩��河渠х��琛f��淇���锛��d�广大辨��娴�琛�娆句�锛���浠ヨ�╃�绋�璇�瑷�瑙e�冲������棰�����浼���瑕�����锛��充�浠ュ������浼�娴�琛�锛���宸辫�翠�涓�绠�锛�

����浠��㈤��寮�����UM绯荤�锛��跺�����ュ���瑰氨娌℃��绠���宸卞���缂�绋�璇�瑷�锛��崇�存�ヤ娇��JavaScript锛�涓�杩����ュ���起�JavaScript澶��ㄦ��河渠�锛�浣跨��JavaScript�规��娌℃����娉���涓�娆惧��缇���IDE锛���涓����芥����锛�骞朵�娣蜂贡��杩���广大辨��JS���ㄦ��璇�瑷�锛�濡���广大��惰浆��涓洪����璇�瑷�锛�浼�浠ョ�雾�叉�ц�戒负浠d环锛���涓���娉�����������绾跨���澶�绾跨����规�э�骞朵�杩���娉�涓�UM IDE��涓轰�浣�锛���浠ユ病魔��娉�锛���寮���涓�娆捐��宸辩��缂�绋�璇�瑷�Ori锛�骞朵�����河渠��板��绉�缂�绋�璇�瑷���浼�绉��规�э���涓����ヤ��村��杩����规�э�濡���稳定�SQL������缁�浠躲�������版��搴�������璺ㄥ钩�扮演��璇�娉���疏浚㈡�风�����$��涓�浣��������х���存�扮演��锛�锛�褰��讹�杩�河渠��规�ч��瑕�涓�UM IDE�������戒娇�ㄣ��

4. 寮���缂�绋�璇�瑷�锛�浠�杩���璧疯��锛���缃�Antlr4��澧�

濡���涓�涓��ュ氨寮���缂�绋�璇�瑷�锛�浼拌�″ぇ疏浚跺氨寮�彭���河渠�锛���浠ユ��浠���浠���绠�����寮�彭�锛�广大辨�����ョ���涓�涓���浠ヨВ������涔��よ〃杈惧���缂�璇��ㄣ����浠�浣跨�ㄤ�antlr4�ョ����璇�娉������ㄥ��璇�娉�������锛���浠ュ��瑕���缃�涓�涓�antlr4��寮�����澧���

�变�antlr4浣跨��Java寮���锛���浠ヤ�绠$�ㄤ�涔�缂�绋�璇�瑷�璁捐�$�璇���锛�JDK蹇�椤诲��瑁�锛�骞朵�杩���瑕�涓�娆惧己澶х��Java IDE锛�杩����ㄨ��Intellij IDEA����浠���浣跨��Intellij IDEA�����雾����斤���浠�CE锛�绀惧�雾��锛���瓒冲�河渠�锛�杩�涓���������璐圭����

�ㄥ��瑁�疏浚�Intellij IDEA CE��锛��颁��㈢��椤甸��涓�潘�antlr4宸ュ�风�稿�崇��搴���

https://www.antlr.org/download.html

杩��ラ〉��锛��惧�颁��㈢���ㄥ��锛��瑰�荤��1涓��炬�ヤ�潘藉�冲����

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

涓�潘藉��antlr4��宸ュ�山����锛��惧�板�朵腑��Java杩�琛��跺�锛�骞剁��Intellij IDEA CE��寤轰�涓�Java宸ョ�锛��跺���存�ュ�Antlr4 Java杩�琛��跺�澶��跺�板伐绋���lib��褰�涓�锛�娌℃��lib��褰���浠ュ缓绔�涓�涓�锛�锛�濡�涓��炬��绀恒��

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

�跺����lib��褰����抽������涓��瑰�烩��Mark Directory as��>��Sources Root������椤癸�广大�lib缂�绋�婧�浠g����褰�锛�杩���Intellij IDEA CE广大变���绱�lib��褰�涓�������搴���褰��讹���浠ョ�存�ュ�ㄦā��涓�寮���antlr4��搴�锛�涓�杩�广大�antlr4 杩�琛��跺�涓�宸ョ��惧�颁�璧凤�杩��山���广大�宸ョ�澶��跺�板�朵��哄�ㄤ�锛�广大变�浼��变�antlr4��杩�琛�搴�娌℃��澶��惰��瀵艰�存��娉�杩�琛�河渠���

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

�跺����瑕�疏浚�瑁�Intellij IDEA CE��Antlr��浠躲��杩��ユ��浠跺��瑁�椤甸��锛�濡���娌℃��疏浚�瑁�antlr��浠讹�����Marketplace��绛鹃〉锛�杈���antlr��绱㈡��浠讹���甯哥��涓�涓�广大辨�����瑰�诲�充晶��install�����冲��疏浚�瑁���濡���宸茬�疏浚�瑁�锛�Antlr��浠朵��雾�板��Installed椤甸��涓�锛�濡�涓��炬��绀恒��
���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

疏浚�瑁�疏浚�Antlr��浠跺��锛��板��寤轰�涓���浠讹�广大���浠舵�╁���璁剧疆涓�g4锛�广大变����版��浠跺���㈢���炬������河渠�绾㈣�诧����㈡��涓�涓�A海洋�姣�锛�杩�广大辨��Antlr4����璇�锛�濡�涓��炬��绀恒��

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

5. Antlr4��Hello World

�板�ㄦ��浠�寮�彭�杩��ユ��ㄤ汉蹇����跺�讳�锛���Antlr4河渠叉������浠���绗�涓�涓�缂�璇���锛�瑙f������杩�绠�琛ㄨ揪寮���璁$���ㄣ��涓�杩��ㄥ����杩�涓�缂�璇��ㄤ���锛�涓�疏浚�瑕�河渠�瑙d�涓�Antlr4��

涓��㈠��缁��轰�涓���浠ヨ����浠�hello寮�澶寸��璇�缁���璇���绋�搴�����娉���兄弟�����寤轰�涓���涓�Hello.g4����浠讹�骞惰��ヤ��㈢��浠g��锛�

grammar Hello;
r  : 'hello' ID ;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ; 

澶у�跺��涓���瑕�绠¤�河渠�浠g����浠�涔�����锛�����瑕��х���昏��杈��ュ�冲����

�跺����Hello.g4�抽�������瑰�烩��Configure ANTLR������椤癸�浼�寮瑰�哄�涓��剧��瀵硅��妗�锛�璁剧疆绗�涓�涓�����杈��ユ�锛���疏浚�������褰�锛�杩�����疏浚�涓�Hello.g4�稿������褰���Hello.g4��������浠堕�戒��惧�ㄨ�涓���褰�涓���
���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

�跺���瑰��Hello.g4�抽����������Generate ANTLR Recognizer������椤癸�浼����ㄧ����涓�����浠讹�濡�涓��炬��绀恒��娉ㄦ��锛�Java��浠堕�介����河渠��╁�����

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

Hello.java��MyHelloVisitor.java�����ュ��寤虹��锛��朵���浠堕�芥�����ㄧ���������朵腑HelloLexer.java��璇�娉������ㄣ��HelloParser.java��璇�娉�������锛��朵���浠跺���㈠��璇淬��

澶у�跺��浠ユ��寮�杩�涓や锅��浠讹����版��涓�涓���浠剁����疏浚归�芥��涓��捐�锛�杩�瑕���河渠哄伐缂���锛�浼�绱�姝讳汉锛���浣跨��Antlr4锛�����瑕�4琛���娉�广大辨��疏浚���濡���瑕�娣诲����淇��瑰���ョ��璇�娉�锛�����瑕�淇���Hello.g4��浠讹��跺�������扮演����涓����冲����

�板�ㄦ��涓�涓���棰�锛���涔���Hello.g4������涓�����浠跺��锛������㈢���娉�锛�������杩�河渠���浠舵��浠�涔��ㄥ��锛�

Hello.g4������杩�河渠���浠剁��涓昏�����广大辨��杩�琛�璇�娉�������璇�娉�����锛��d�濡�浣��ㄥ��锛�浣跨�ㄦ��濡�涓�涓ょ��瑰�锛�

  1. ��grun宸ュ�锋�璇�
  2. ��Java浠g��璋��ㄨ��娉������ㄥ��璇�娉�������锛�缂���疏浚��寸��缂�璇���

�板�ㄥ���ヨ�磋��grun宸ュ�枫���跺��骞舵病��grun杩�涓�涓�瑗匡�grun��涓�涓�����锛���疏浚���宸ュ�山�ㄦ��antlr-4.8-complete.jar涓��� org.antlr.v4.gui.TestRig绫伙���macOS��Linux涓�锛���浠ヤ娇��alias�戒护璧蜂�涓�����锛�疏浚��瑰��grun锛���浠ヨ���广大辨部�ㄤ�疏浚��圭����娉���濡�����windows涓�锛���浠ュ��寤轰�涓�grun.cmd��浠躲��

璧峰������疏浚��村�戒护濡�涓�锛�

alias grun='java -classpath .:/System/Volumes/Data/sdk/compilers/antlr4-4.8/antlr-4.8-complete.jar org.antlr.v4.gui.TestRig'

�板�ㄥ氨��浠ヤ娇��grun娴�璇���浠���绋�搴�河渠���

兄弟���瑕�璇存��涓��戊寅�grun娴�璇�����.class��浠讹�涓���.java��浠讹���浠ュ�ㄦ�璇�涔���锛�瑕��ㄧ�绔�涓����㈠��.class��浠舵���ㄧ����褰���Intellij IDEA CE榛�璁ょ��.class��褰���out/production��褰�锛�濡�涓��炬��绀恒���ㄤ�寮�彭�锛����㈢������.java��浠跺苟娌℃��缂�璇�锛�璇昏����浠ラ��岛挎�句釜Java绋�搴�杩�琛�涓�锛�杩���Intellij IDEA CE浼�缂�璇�����杩�娌℃��缂�璇���.java��浠讹���浠�浼����起���������������.java��浠堕�界����河渠�������.class��浠躲��
���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

璇昏����浠ョ�存�ュ�ㄦ��浣�绯荤���缁�绔�杩���.class���ㄧ����褰�锛�������杩�Intellij IDEA CE涓��圭��Terminal涔���浠ヨ��ュ�戒护琛�锛�濡�涓��炬��绀恒��

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

�板�ㄦ�ュ����浠���绗�涓�涓�娴�璇�锛�

兄弟���杈��ヤ��㈢���戒护锛���涓���瑕�绠″�戒护��浠�涔�����锛�锛�
grun Hello r -tokens

�跺��杈��ヤ��㈢����疏浚癸�
hello world

濡���璇昏����macOS��Linux涓�锛���Ctrl+D锛�濡�����Windows涓�锛���Ctrl+Z杈��ョ���绗��凤�浼�杈��哄�涓��剧����疏浚癸�

���村�藉�����锛�寮���涓��戒汉��宸辩��缂�绋�璇�瑷�锛�1锛�锛�缂���瑙f��琛ㄨ揪寮���璁$����

�板�ㄦ�ヨВ��涓�涓�grun Hello r -tokens��浠�涔�������Hello琛ㄧずHello.g4涓�grammar���㈢���ㄥ��锛�涔�广大辨��Hello��r����娉�河渠х��寮�绛��山乏渚х��绗��凤���缁�缁�绗�锛�锛�涔�广大辨��r : 'hello' ID ;涓���r�� -tokens琛ㄧず���烘������tokens��

�d�浠�涔���token��锛� �跺��token��璇�娉������ㄧ��杈��虎����讹�token广大�浣�涓鸿��娉������ㄧ��杈��ワ���AST锛��借薄璇�娉���锛�����璇�娉������ㄧ��杈��恒��

token广大辨��缂�绋�璇�瑷�涓�涓�������������锛��稿�河渠�缂�绋�璇�瑷�����海洋�����涓��㈢��绋�搴�锛�

if(i == 10) {
}

杩���涓�涓���甯哥�������′欢璇��ワ��d��ㄨ�涓よ�浠g��涓�锛���澶�广大�涓�token��锛��规��token涓������茬������锛�����濡�涓���token锛�
if,(,i,==,10,),{,}

涓��㈢�ㄩ���凤�,锛�������绗��烽�芥��token锛�岛�濡�锛�if���抽��海洋�锛�广大�浣�涓轰�涓��翠�瀵瑰�锛��ㄨВ��浠g���讹���疏浚�涓�浼�广大�if��寮�锛�10��涓�涓��存�起�涔�广大�浣�涓轰�涓��翠�瀵瑰�锛���疏浚�涓�浼�广大��舵����1��0��

�d�Hello��杈��雾������崇��浠�涔���锛���浠�杈��ヤ�hello world锛��规��璇�娉�瑙�����浠讳�海洋�绗�涓查�介��瑕�浠�hello寮�澶达���浠�hello广大�浣�涓轰�涓�token锛��稿�河渠����㈡�′欢璇��ョ��if�抽��海洋�锛�杩���hello��涓�涓��抽��海洋�锛��������㈠��浠ユ��浠绘��海洋�绗�涓诧�浣�涓�hello涔��磋�冲�瑕���涓�涓�绌烘�笺����浠�hello world绗���Hello��璇�娉�瑙���锛�hello abc涔����风����锛���helloabc广大变�绗���河渠�锛���涓�hello��abc涔��存病��浠讳�����绗�锛��规�����垮�归������锛�Antlr4浼����╂���跨��海洋�绗�涓茶�琛��归��锛���浠ュ�归������helloabc锛���涓���hello��

�板�ㄦ��浠���疏浚�楠�涔���疏浚�河渠�锛����藉�澶�璇昏��杩���涓�澶撮�炬按锛�涓�杩�涓�瑕�绱э���浠���璇�缁�璁蹭�涓�Antlr4�板�����涔���������

Antlr4���ㄤ���椤跺��涓���褰��������瑰�����椤跺��涓�广大辨����广大��翠釜缂�绋�璇�瑷�婧���浠剁����涓�涓��翠�锛�杩�广大辨���ュ�g�戊寅�涔�广大辨��Hello.g4涓���r��杩�涓��ュ�g�硅捣浠讳���海洋��藉��浠ワ���瑕�涓����朵�����娉���璇������冲�����跺��浠�杩�涓��ュ�g�瑰�彭�锛�广大卞��浠ョ�ㄩ��褰����瑰�����娉�河渠�����娉��ㄤ�浠�涓��颁��ㄥ�硷�宸�岛ф����娉���璇�锛��充晶����娉���河渠х��寮���岛�濡�锛�瑕�璇���涓���涓�缁�海洋�绗�涓诧�

hello world
hello abc
hello Bill
hello ��疏浚�

寰����撅�杩�4琛������芥��浠�hello寮�澶达����㈣���浠绘����海洋�绗�涓诧�涓��寸�ㄧ┖�煎��������浠ユ��浠�����娉�搴�璇ユ��浠�hello寮�澶达����㈣�涓�涓���璇�锛���ID琛ㄧず����娉�濡�涓�锛�
r : 'hello' ID;

��Antlr4涓�锛�姣�涓�涓���娉��借��ㄥ���凤�;锛�缁�广大撅�濡������哄����海洋�绗�涓诧�濡��抽��海洋�锛��ㄥ��寮��锋��璧锋�ャ��濡�'hello'��

ID琛ㄧず浠绘������璇�绗�锛�涔���缁�缁�绗�����璋�缁�缁�绗�锛�����涓��藉��缁х图寰�涓��ㄥ�肩��绗��凤��稿�河渠������跺�����戊寅�����Antlr4涓�锛�缁�缁�绗���璇��ㄧ�遍�海洋�姣�澶у����海洋�绗�涓茶〃绀猴�濡�ID������缁�缁�绗�锛���浠ョ户缁�寰�涓��ㄥ�硷��ㄩ�海洋�姣�广大�����海洋�绗�涓茶〃绀猴�濡�r��
�板�ㄦ����椤跺��涓�������绗�1姝ワ�绗�2姝ユ��澶���ID����娉�濡�涓�锛�
ID : [a-z]+ ;

ID��河渠х��寮�涓�����浠讳�����缁�缁�绗�锛�涔�广大辨����涔���娉�缁х图�ㄥ�间���[a-z]��涓�绉�绠���锛�涔�广大辨��a��z��26涓�广大���海洋�姣�涓���浠讳�涓�涓�锛����㈢�����凤�+锛�琛ㄧず�冲�瑕���涓�涓�广大���海洋�姣���

�扮演�板�ㄤ负姝�锛���椤跺��涓�������杩�绋�宸茬�疏浚���河渠�锛���涓轰袱姝ワ�绗�涓�姝ュ��翠釜瀛�绗�涓茬����涓�涓��翠�锛�骞朵�广大��跺��瑙d负hello�����㈢��浠绘��海洋�绗�涓层��绗�河渠��ㄦ�ュ���杩�涓�浠绘��海洋�绗�涓层��杩���瑙�疏浚�锛�杩�涓�浠绘��海洋�绗�涓插���界�卞���海洋�姣�缁�����

涓�杩��板�ㄨ���涓�涓���棰�锛�Antlr4��涔��ラ��hello��world涔��拈��瑕���绌烘�兼���朵�绌虹�界��������锛��跺��杩�广大辨�����Hello.g4������涓�琛�浠g��河渠�锛�WS : [ \t\r\n]+ -> skip ; 杩�琛�浠g��璁剧疆浜�涓�涓�skip����锛�����浼��ㄥ���㈢����绔�涓�璇�缁�璁茶В锛�锛��ㄤ�蹇界�ユ��疏浚���海洋�绗�锛�杩�河渠�琚�蹇界�ョ��海洋�绗�锛�广大�浣�涓�token������绗�锛�杩����㈡��疏浚�河渠�4涓�����绗�锛�绌烘�笺���惰〃绗�锛�\t锛�����潘�绗�锛�\r锛����㈣�绗�锛�\n锛���涔�广大辨��璇达�涓��㈢��褰㈠�涔�����浠ョ��锛�

hello
world

ok锛��板��Hello.g4��璇�娉�瑙���宸茬�璁茬��宸�涓�澶�河渠�锛����㈡����颁�涓�河渠�姒�蹇碉��ㄥ���㈢����绔�涓�浼�璇�缁�璁茶В���板�ㄦ�ユ�荤�涓�涓�锛�

Antlr4����娉���浠舵��浠�g4浣�涓烘�╁���锛�绗�涓�琛�浠g��蹇�椤讳互grammar寮�澶达����㈣���璇�娉���锛�濡�Hello锛�璇ュ��海洋�蹇�椤讳�g4��浠跺��涓��淬��姣�涓�琛�浠g���藉�椤荤�ㄥ���凤�;锛��������跺��广大辨���ュ共��娉�河渠х��寮�河渠���岛�濡�锛�Ori璇�瑷�����椤剁����娉���杩��风����

grammar Ori;
program : sourceElements? EOF
sourceElement   : statement
statement
:
    importStatement
    | sqlStatement
    | dollarMemberStatement        
    |  classDeclarationStatement
    |  interfaceDeclarationStatement
    | functionDeclarationStatement
    | variableStatement     
    | ifStatement                
    | iterationStatement         
    | continueStatement           
    | breakStatement       
    | returnStatement             
    | withStatement             
    | switchStatement           
    | throwStatement           
    | tryStatement                 
    | blockStatement  
    | expressionStatement
    | commentStatement
    ;  

program��Ori璇�瑷����ュ�g�戊寅��跺��Ori璇�瑷�广大��翠釜璇�瑷������ュ共婧�浠g����绱�锛�sourceElements?锛�锛����㈢�����疯〃绀哄����锛�涔�广大辨��璇达�Ori璇�瑷���婧�浠g����浠跺��浠ユ��绌烘��浠躲��EOF����浠剁���绗���杩���璁叉��涓�涓�婧�浠g����绱�瀵瑰�涓���statement锛�璇��ワ�锛�杩���涔���浠ヤ��存�ヤ娇��statement锛�����浣跨��sourceElement锛�����涓轰互�����戒�杩�琛��╁�锛�杩��跺����瑕�淇���sourceElement�冲��锛�����sourceElement绛�河渠�statement锛�锛���涓��¤���ュ����澶�绉�锛�濡�ImportStatement��sqlStatement锛���稳定�SQL锛���classDeclarationStatement锛�绫诲0��锛�绛����跺��广大辩户缁�寰�涓���锛�濡�sqlStatement杩�浼�����sqlInsert��sqlUpdate绛���浠ユ�ょ把��锛��村�颁�������涓烘����杩�广大辨����椤跺��涓��������烘���规�锛��跺��杩�广大辨����娌绘���涓�绉�琛ㄧ�起�广大界�$�绋�璇�瑷�����寰�澶���锛�涓�涓�澶у��绯荤����戒���涓��句����虫�村�琛�浠g��锛�浣�濡���广大�缂�绋�璇�瑷�浠�椤跺��涓�����锛�娑����扮演��璇��ョ�绫讳�涓�杩�����绉���宸层��Ori璇�瑷�����娉���浠朵�广大�1000澶�琛�锛�����璇�娉���浠堕�ㄥ��锛�涔�广大�2000琛��哄ご����2000琛�浠g��锛�广大卞��浠ュ���ㄦ��杩颁�绉��剧�靛��澶���缂�绋�璇�瑷�锛�����perfect����杩�2000琛�浠g��锛�������Go璇�瑷�浠g��瓒�杩�河渠�60000琛���

�板�ㄥ������grun宸ュ�蜂��ャ���跺��grun�����藉�寮哄ぇ锛��や���浠ヤ�涓烘�璇�宸ュ�山�锛�杩���浠ユ�剧ずAntlr4������AST锛���涓�涓���椤跺��涓�������娴�绋���

兄弟�����澶�涓�涓�hello.txt��浠讹�骞惰���hello world���跺���ㄧ�绔�杈��ヤ��㈢���戒护锛�璇昏��瑕�广大�hello.txt��浠剁��璺�寰��规����宸辨�哄�ㄤ���璺�寰�锛�锛�

grun Hello r -gui < /MyStudio/java/java_knowledge/antlr/test/hello.txt

�跺��广大变�寮瑰�哄�涓��剧��绐��o��充晶�剧ず河渠�AST�����剁�����Antlr4�朵�缂�璇��ㄧ��杩�绋�广大辨�����规��婧�浠g������AST锛��跺��瀵�AST杩�琛�����锛��规��璇�瑷����规�э�浼�����1��n��锛�锛�����疏浚���锛�广大变�����涓��翠唬����浠ュ����缁���河渠�杩��舵��浠躲����浠�AST璧峰�颁��垮��������浣��ㄣ��

6. 濡�浣��ㄧ�搴�杩�琛�璇�娉���璇�娉�����

广大界�″凡缁�河渠�瑙d�Antlr4���烘��浣跨�ㄦ�规�锛�浣��扮演�板�ㄤ负姝�锛�杩�娌℃����Java缂���杩�涓�琛�浠g����锛��板�ㄦ��广大辨�ユ�绀哄�浣���Java璋��ㄤ�涓���������璇�娉������ㄥ��璇�娉������ㄣ��

涓��㈠��缁��哄���颁唬��锛�

兄弟�����寤轰�涓�MyHelloVisitor.java��浠讹�骞惰��ヤ��㈢��浠g��锛�

import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;

public class MyHelloVisitor extends AbstractParseTreeVisitor<String> implements HelloVisitor<String> {

    @Override public String visitR(HelloParser.RContext ctx) {
        System.out.println(ctx.getText());
        System.out.println(ctx.ID().getText());
        return visitChildren(ctx);
    }
}

�跺������寤轰�涓�Hello.java��浠讹�骞惰��ヤ��㈢��浠g��锛�

import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;

public class Hello {
    public static void main(String[] args) throws Exception  {
         // 璇诲��婧�浠g����浠讹�杩������╃�存�ヤ�海洋�绗�涓茶�诲��
         CharStream input = CharStreams.fromString("hello world");
        // ��寤鸿��娉������ㄥ�硅薄 
        HelloLexer lexer = new HelloLexer(input);
        // �山��璇�娉������ㄨ��雾��tokens
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        // ��寤鸿��娉������ㄥ�硅薄锛�骞跺�璇�娉������ㄨ��雾��tokens浣�涓鸿��娉������ㄧ��杈���
        HelloParser parser = new HelloParser(tokens);
        // 寮�彭�����绋�搴�锛�杩�涔�������AST��杩�绋�
        ParseTree tree = parser.r();    // ��娉����ュ�g��r浼�潘���涓轰�涓��规�锛�璋��ㄨ�ユ�规�锛�广大变���椤跺��涓���褰�����婧�浠g��
        // ��寤�Visitor瀵硅薄
        MyHelloVisitor hello = new MyHelloVisitor();
        // 寮�彭�����AST
        hello.visit(tree);
    }
}

�板�ㄨ�琛�Hello.java锛�濡�����Run绐��h��哄�涓��剧����疏浚癸�璇存��杩�琛�����河渠���

�板�ㄦ�ヨВ��涓�涓����㈢��浠g����杩�����瑕��ラ��Antlr4��濡�浣�����AST����Antlr4��濡�涓�涓ょ��瑰�����AST锛�
锛�1锛�listener
锛�2锛�visitor

绗�涓�绉��瑰��寸�垫椿锛�浣�涓�疏浚规��浣跨�ㄣ��visitor涓��垫椿锛�浣�疏浚规��浣跨�ㄣ����岛�浣跨�ㄤ�绗�2绉��瑰��ラ����AST锛�浣���绯诲����绔���澶у��颁唬��涓昏�浣跨��listener�ラ����AST��listener�瑰�浼��ㄥ���㈢����绔�涓�璇�缁�浠�缁�锛�杩���涓昏�浠�缁�visitor���跺��杩�涓ょ�����AST���瑰�������绫讳技锛��芥�����颁�涓�涓����戊寅�广大变�璋��ㄧ�稿�����璋��规�锛��跺��广大�蹇�瑕���淇℃��浣�涓哄���颁��ュ��璋��规�锛��ㄦ�山��浠ュ�ㄥ��璋��规�涓�疏浚���浠g���������版��澶�����涓��翠唬��浼���绛�宸ヤ����d�杩�河渠���璋��规��惧�ㄥ������锛�杩�广大辫�璇村�板���㈠��寤虹��MyHelloVisitor绫汇��璇ョ把瀹��颁�HelloVisitor�ュ�o�璇ユ�ュ�f���规��Hello.g4��浠惰���ㄧ������锛�浠g��濡�涓�锛�

import org.antlr.v4.runtime.tree.ParseTreeVisitor;
public interface HelloVisitor<T> extends ParseTreeVisitor<T> {  
    T visitR(HelloParser.RContext ctx);
}

��浠���浠ョ���起�璇ユ�ュ�d腑����涓�涓��规�锛�广大辨��visitR锛�璇ユ�规���������r���硅��ㄧ����璋��规���

濡�����娉���浠跺�澶ф�讹�浼������稿�澶�����璋��规�锛�岛�濡�锛�Ori璇�瑷�����娉�广大辩����河渠��扮演�句釜��璋��规�锛�杩�河渠���璋��规�骞朵�涓�疏浚��界�ㄥ�起��ㄨ�绉����仪式�锛�骞朵���瑕�疏浚��版��������璋��规�锛���浠�Antlr4�ㄧ������璋��ュ�f��浠剁�����讹�杩�����河渠�涓�涓�榛�璁ゅ���扮演被锛�濡���岛���HelloBaseVisitor锛�榛�璁ゅ���扮演被宸茬�榛�璁ゅ���颁���������璋��规�锛���浠���Visitor绫诲����瑕�浠�璇ョ把缁ф�救救�广大卞����瑕�疏浚��板�瑕�����璋��规��冲����

import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;

public class HelloBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements HelloVisitor<T> {

    @Override public T visitR(HelloParser.RContext ctx) { return visitChildren(ctx); }
}

��岛���MyHelloVisitor绫荤户�夸�HelloBaseVisitor绫伙�骞惰���河渠�visitR�规�锛�杈��轰�r���圭��������ID��������

瀵逛�Hello绫绘�ヨ�达�广大辨����缁���璋��ㄤ唬��河渠�����甯镐�涓���Antlr4疏浚��扮演��缂�璇���锛���瑕�缁�杩�濡�涓���姝ワ�

锛�1锛�璇诲��婧�浠g����浠讹����存�ヤ�海洋�绗�涓茶�山��婧�浠g��锛�
锛�2锛���寤鸿��娉�������锛�杈��ユ����涓�海洋�绗���杈��烘��tokens锛�
锛�3锛���寤鸿��娉�������锛�杈��ユ��tokens��杈��烘��AST锛�
锛�4锛�寮�彭�����AST

杩�4姝ュ凡缁���Hello绫讳腑��河渠�璇�缁���娉ㄩ��锛�澶у�跺��浠ヨ��琛��ョ����

7. 寮�涓�涓���浠ヨВ��琛ㄨ揪寮���璁$����

���㈠凡缁�缁��轰�涓�涓�疏浚��寸��Antlr4妗�岛�锛�涓�杩�杩�涓�妗�岛�澶�绠���河渠�锛�娌′�涔�疏浚������ㄩ��锛�����浼��╃��Antlr4疏浚��颁�涓���疏浚���浠峰�肩��璁$���ㄧ�搴���璇ョ�搴���浠ヨВ��杩�涓�琛ㄨ揪寮�锛�琛ㄨ揪寮���������涔��よ�绠�锛�姣�涓�涓�琛ㄨ揪寮���涓�琛�锛��ㄥ���凤�;锛�缁�广大俱��

��缁��烘��娉�锛�Calc.g4

grammar Calc;
// 涓��㈡��璇�娉�
prog:   stat+ ;

stat:   expr ';'                # printExpr
    |   ID '=' expr ';'         # assign
    |   NEWLINE                 # blank
    ;

expr:   expr op=('*'|'/') expr      # MulDiv
    |   expr op=('+'|'-') expr      # AddSub
    |   INT                         # int
    |   ID                          # id
    |   '(' expr ')'                # parens
    ;
// 涓��㈡��璇�娉�
MUL :   '*' ;
DIV :   '/' ;
ADD :   '+' ;
SUB :   '-' ;
ID  :   [a-zA-Z]+ ;      // �归����璇�绗�
INT :   [0-9]+ ;         // �归���存��
WS  :   [ \t]+ -> skip ; // 蹇界�ョ┖�界��
NEWLINE:'\r'? '\n' ;     // 绌鸿�

�板�ㄧ����Calc.g4 ���稿�虫��浠躲������涓�涓�������CalcVisitor.java��浠讹�浠g��濡�涓�锛�

import org.antlr.v4.runtime.tree.ParseTreeVisitor;
public interface CalcVisitor<T> extends ParseTreeVisitor<T> {
    T visitProg(CalcParser.ProgContext ctx);    
    T visitPrintExpr(CalcParser.PrintExprContext ctx);
    T visitAssign(CalcParser.AssignContext ctx);
    T visitBlank(CalcParser.BlankContext ctx);
    T visitParens(CalcParser.ParensContext ctx);
    T visitMulDiv(CalcParser.MulDivContext ctx);
    T visitAddSub(CalcParser.AddSubContext ctx);
    T visitId(CalcParser.IdContext ctx);
    T visitInt(CalcParser.IntContext ctx);
}

CalcVisitor��9涓���璋��规�锛�浠���娉�涓���锛���澶�广大�涓���娉�锛�广大卞�璇ユ��澶�广大�涓���璋��规�����Calc.g4涓�锛��や�绗�涓�涓���娉�锛�prog:stat+;)澶�锛��朵�����娉��借捣浜�����锛�濡�printExpr锛�assign绛�����浠ヨ�河渠���娉�瀵瑰�����璋��规��芥��浠ュ����浣�涓哄��缂���锛��跺�����㈠��涓�visit���跺��杩�9涓��规�锛�����缁�杩�河渠�AST��9涓����跺�����瑰��锛�濡�������璇�锛�锛�琚�����璋��ㄣ��
岛�濡�锛��板�ㄦ�璇�杩�涓�琛ㄨ揪寮�锛�广大�琛ㄨ揪寮��剧疆expr.calc��浠朵腑锛�锛�1+3 * 4 - 12 /5;

grun Calc prog -gui &lt; /MyStudio/java/java_knowledge/antlr/Calc/expr.calc

�ц�涓��㈢���戒护锛�浼��剧ず濡�涓��剧��AST��

瑕�璁$��涓�杩拌〃杈惧�锛�广大遍��瑕�����杩�妫�AST��岛�濡�锛�褰�������prog���规�讹�广大变�璋���visitProg�规�锛���杩�璇ユ�规������板��浠ヨ�山��prog���圭���存�ュ�����圭��淇℃��锛�广大辨��宸��充袱涓�stat���戊寅���褰����板��娉�琛ㄨ揪寮��讹�广大变�璋���visitAddSub�规�锛�浠ユ�ょ把�ㄣ��

�板�ㄧ��涓�涓�EvalVisitor绫荤��疏浚��般��璇ョ把��疏浚��板������褰��存�ヨ�$��涓や锅�兼�讹�濡�3 * 5��4 - 1锛�广大卞������visitMulDivhe visitAddSub�规�璁$��锛�骞堕��杩�杩����艰���璁$��缁�����濡������板����锛�Calc��������锛�锛���瑕�兄弟���广大������惧�颁�涓�Map涓�锛��跺���ㄨ�山��璇ュ�����讹�浼�浠�Map璇诲����Map�稿�河渠�涓�涓�绗��疯〃��

import java.util.HashMap;
import java.util.Map;

public class EvalVisitor extends CalcBaseVisitor<Integer> {
    /** "memory" for our calculator; variable/value pairs go here */
    Map<String, Integer> memory = new HashMap<String, Integer>();
    boolean error = false;

    /** ID '=' expr NEWLINE */
    // ��彭�����������浣�锛�璧��兼��浣�锛�
    @Override
    public Integer visitAssign(CalcParser.AssignContext ctx) {
        String id = ctx.ID().getText();  // id is left-hand side of '='
        int value = visit(ctx.expr());   // compute value of expression on right
        memory.put(id, value);           // store it in our memory
        return value;
    }

    /** expr NEWLINE */
    // 杈��鸿〃杈惧���璁$��缁���
    @Override
    public Integer visitPrintExpr(CalcParser.PrintExprContext ctx) {
        Integer value = visit(ctx.expr()); // evaluate the expr child
        System.out.println(value);         // print the result
        return 0;                          // return dummy value
    }

    /** INT */
    // 广大�海洋�绗�涓插舰寮����存�拌浆��涓烘�存�扮演被��
    @Override
    public Integer visitInt(CalcParser.IntContext ctx) {
        return Integer.valueOf(ctx.INT().getText());
    }

    /** ID */
    @Override
    public Integer visitId(CalcParser.IdContext ctx) {
        String id = ctx.ID().getText();
        // 浠�Map涓��山���������� 
        if ( memory.containsKey(id) ) {
            return memory.get(id);
        } else {
            // 寮��ㄤ�涓�海洋��ㄧ������锛�杈��洪��璇�淇℃�� 
            System.err.println(String.format("����<%s> 涓�海洋���锛�",id));
            error = true;

        }
        return 0;
    }

    /** expr op=('*'|'/') expr */
    // 璁$��涔�娉����ゆ�
    @Override
    public Integer visitMulDiv(CalcParser.MulDivContext ctx) {

        int left = visit(ctx.expr(0));  // get value of left subexpression
        int right = visit(ctx.expr(1)); // get value of right subexpression

        if ( ctx.op.getType() == CalcParser.MUL ) return left * right;
        return left / right; // must be DIV
    }

    // 璁$����娉�����娉�
    /** expr op=('+'|'-') expr */
    @Override
    public Integer visitAddSub(CalcParser.AddSubContext ctx) {
        int left = visit(ctx.expr(0));  // get value of left subexpression
        int right = visit(ctx.expr(1)); // get value of right subexpression
        if ( ctx.op.getType() == CalcParser.ADD ) return left + right;
        return left - right; // must be SUB
    }

    /** '(' expr ')' */
    // 澶������疯〃杈惧�
    @Override
    public Integer visitParens(CalcParser.ParensContext ctx) {
        return visit(ctx.expr()); // return child expr's value
    }
}

������涓�涓�涓荤�搴�锛�MarvelCalc锛���婧�浠g����

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import java.io.FileInputStream;
import java.io.InputStream;

public class MarvelCalc {
    public static void main(String[] args) throws Exception  {
        // 浠���浠惰�诲��婧�浠g�� 
        String inputFile = null;
        if ( args.length>0 ) {
            inputFile = args[0];
        } else {
            System.out.println("璇�娉��煎�锛�MarvelCalc inputfile");
            return;
        }
        InputStream is = System.in;
        if ( inputFile!=null ) is = new FileInputStream(inputFile);

        CharStream input = CharStreams.fromStream(is);

        CalcLexer lexer = new CalcLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        CalcParser parser = new CalcParser(tokens);
        ParseTree tree = parser.prog(); // ����婧�浠g��

        EvalVisitor eval = new EvalVisitor();

        eval.visit(tree);
    }
}

��expr.calc��浠朵腑杈��ヤ��㈢����疏浚癸�

1+3 * 4 - 12 /6;
x = 40;
y = 13;
x * y + 20 - 42/6;
z = 12;
x + 5 * z - y;

骞朵娇�ㄤ��㈢���戒护琛��ц�璁$���ㄧ�搴�锛�����IDE涓�广大�expr.calc浣�涓哄���板��璁�MarvelCalc��

java MarvelCalc expr.calc

浼�寰��颁��㈢��缁���锛�

11
533
87

��浠���浠ョ���起���expr.calc��浠朵腑锛���3涓���浠ヨ�$����琛ㄨ揪寮�锛��朵腑����涓や釜琛ㄨ揪寮�浣跨�ㄤ�����锛���杈��雾���广大辨��杩�3涓�琛ㄨ揪寮���璁$��缁�����浠�Calc.g4涓�涔���浠ョ���恒��璇��ヤ��辨��濡�涓�3绉�锛�
(1) 杈��鸿〃杈惧�锛�����杩�绠���id��甯搁��锛�
(2)璧��艰〃杈惧�锛���寤哄����锛�
(3)绌鸿�

浠�EvalVisitor绫荤��疏浚��板��浠ョ���虎�����杈��鸿〃杈惧���浼�杈��雾���锛��朵���琛ㄨ揪寮������ㄥ���ㄨ�$��锛��������ㄧ���锛�濡���Map涓�海洋��ㄥ�������笺��

OK锛��扮演�板�ㄤ负姝�锛���浠�宸茬���寤轰�涓�涓���甯稿���ㄧ��璁$���ㄧ�搴�锛�涓�杩�杩�涓�绋�搴�浠��跺�绠���锛��ㄥ���㈢����绔�涓�锛�广大�浼�涓����╃�ㄦ�板���扮演���ヨ��疏浚����村�����缂�璇��ㄧ�搴�锛��村�板��浠ュ����Marvel璇�瑷�涓烘����