antlr指南 第四章 语法分析

语法解析器ANTLR4的java表达式解析实战 阅读详情

第四章 语法分析

语法分析是编译过程的第二步,在词法分析提供的记号流的基础上,对源代码的结构做总体的分析。无论分析的内容有多大语法分析总是由一个启始规则开始的,最后总是生成一棵语法树。一般情况语法规则是一个文法的主体部分,也是编写文法的难点。本章用几个示例来讲述如何用ANTLR定义语法规则。

 

4.1语法分析的方法

    在ANTLR中语法分析定义的规则名必须以小写字母开始大写如“baseClass”,“subfixSymbol”。如果词法规则与语法规则写在同一个文件时,虽然ANTLR中并没有严格定义规则的先后顺序,但一般情况下语法规则写到词法规则的上面,因为整个文法的启始规则是从语法规则开始的,这样可以从上到下查看整个文法。

    ANTLR中语法定义的方法与词法基本相同请看下面一个SQL文法的片段示例:

grammar Test;

sqlStatement : selectStatement | insertStatement | deleteStatement;

selectStatement : SELECT (ALL | DISTINCT)?  SelectList FROM tableSource;

SelectList : SelectItem+;

tableSource : TableName | '(' selectStatement ') ';

 

4.2递归定义

定义文法时通常出现递归的情况,比如上例中tableSource中的子查询就是一个递归定义。在C++,C#,java语言中类名这样的符号是用“.”分隔的多个标识符组成的,如java.IO,System.Web.UI等这种情况需要使用递归的方法来定义,递归有左递归和右递归。

左递归:

qualifiedName : qualifiedName '. ' Identifier;

qualifiedName : Identifier;

Identifier : ('a'.. 'z' | 'A'.. 'Z' | '_') ('a'.. 'z' | 'A'.. 'Z' | '_' | '0'.. '9')*;

右递归:

qualifiedName : Identifier '.' QualifiedName

qualifiedName : Identifier;

Identifier : ('a'.. 'z' | 'A'.. 'Z' | '_') ('a'.. 'z' | 'A'.. 'Z' | '_'| '0'.. '9')*;

不过在ANTLR中不允许左递归定义,ANTLR会提示:“rule is left-recursive”错误。ANTLR中还有别一种定义方法,象类名这样的符号递归定义使用这种方法是最好的方案。原因我们会在后面章节讲述。

qualifiedName : Identifier ('.' Identifier)*;

Identifier : ('a'.. 'z' | 'A'.. 'Z' | '_') ('a'.. 'z' | 'A'.. 'Z' | '_' | '0'.. '9')*;

 

4.3 java方法的文法示例

下面来看一个定义java方法的文法,些文法是从ANTLR自带的java.g示例中选出的一段:

methodDeclaration :type Identifier

        (('(' (variableModifier* type formalParameterDeclsRest?)? ')')

('[' ']')*

        ('throws' qualifiedNameList)?

        (   methodBody

        |   ';'

        )) ;

formalParameterDeclsRest :

variableDeclaratorId

(',' (variableModifier* type formalParameterDeclsRest?))?

|   '...' variableDeclaratorId

;

type : Identifier (typeArguments)?

                  ('.' Identifier (typeArguments)? )* ('[' ']')*

|                   primitiveType ('[' ']')*

;

variableModifier : 'final'  |  annotation ;

 

formalParameterDeclsRest :

variableDeclaratorId

(',' (variableModifier* type formalParameterDeclsRest?))?

|   '...' variableDeclaratorId

;

variableDeclaratorId : Identifier ('[' ']')* ;

 

Identifier : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;

 

typeArguments : '<' typeArgument (',' typeArgument)* '>' ;

 

typeArgument : type

           | '?' (('extends' | 'super') type)? ;

 

qualifiedNameList :qualifiedName (',' qualifiedName)* ;

 

qualifiedName :Identifier ('.' Identifier)* ;

methodDeclaration为方法定义的起始规则,后面type Identifier为方法的返回值和方法名,( '(' (variableModifier* type formalParameterDeclsRest?)? ')' ) ('[' ']')*中的variableModifier为参数前的标识符,type为参数的类型formalParameterDeclsRest是对参数其余部分的定义,参数表在“()”中,后面是“[]”字符,这是数组类型为返回值时需要的,因为数据可以是多维的后是用('[' ']')*来定义。

formalParameterDeclsRest用来定义参数表部分,variableDeclaratorId为参数名,如何有一个以上参数(',' (variableModifier* type formalParameterDeclsRest?))?部分字义了第二个到第N个参数的规则,这里使用了右递归方法。Java1.5中支持可变参数 '...' variableDeclaratorId为可变参数的定义。

另外typeArguments配合Identifier来定义泛型类型,使用“<>”括起来一个类型列表,如List<string>。typeArgument与type形成了递归定义,如Hashtable<string,List<stirng>>。

 

4.4 | 作用范围

上例中的typeArgument : type | '?' (('extends' | 'super') type)? 规则无须写成typeArgument:type |  ('?' (('extends' | 'super') type)?)。在同一规则或子规则中“|”使其两侧的内容为并列的选择关系,如果有多个“|”则一起为并列的选择关系,需要改变优先顺序时才使用“()”。

 

4.5 SELECT语句文法示例

下面给出一个SQL SELECT语句文法片段的例子。

grammar Select;

statement

    : selectStatement (SEMICOLON)?;

selectStatement

    : queryExpression  (computeClause)? (forClause)? (optionClause)?;

queryExpression

    : subQueryExpression (unionOperator subQueryExpression)* (orderByClause)?

    ;

subQueryExpression

    :  querySpecification  |  ‘(‘ queryExpression ‘)’

    ;

querySpecification

    : selectClause (fromClause)? (whereClause)? (groupByClause (havingClause)? )?

    ;

selectClause

    : SELECT (ALL | DISTINCT)? (TOP Integer (PERCENT)?)? selectList

    ;

whereClause

    : WHERE searchCondition

    ;

orderByClause

    : ORDER BY expression (ASC | DESC)? (COMMA expression (ASC | DESC)? )*

    ;

groupByClause

    :GROUP BY (ALL)? expression (COMMA expression)* (WITH (CUBE | ROLLUP) )?

    ;

havingClause

    : HAVING searchCondition

    ;

SEMICOLON : ';';

我们对SELECT语句都比较熟悉,看一下SELECT语句文法的大体结构。selectStatement规则表示整个SELECT语句体系,queryExpression表示查询语句可能由多个子查询用UNION到一起unionOperator代表UNION或UNION ALL关键字,orderByClause子句出现在SELECT语句的最后,这里subQueryExpression和queryExpression之间形成了递归定义,子查询中还可以有子查询。whereClause子句和havingClause子句后面都是查询过滤表达式后成它们共用searchCondition规则。

 

4.6 HTML文法示例

下面再看一个HTML文法片段示例:

grammar HTML;

options  {language=CSharp; output=AST;}

document :     OHTML  body  CHTML;

body :    obody  (body_content)*  CBODY ; 

body_content :  body_tag | text;

body_tag :    block; // | heading | ADDRESS

text :     text_tag;

text_tag :      form;// phrase | special | font

block :      table;//paragraph | list | preformatted | div | center | blockquote | HR |

table :      otable (tr)+ CTABLE;

tr :      o_tr (th_or_td)* (C_TR)? ;

th_or_td :      o_th_or_td (body_content)* (C_TH_OR_TD )?;

form :      oform (form_field | body_content)* CFORM;//

oform :      '<form' (ATTR)* '>';

form_field :    inputField;// | select | textarea;

inputField :  '<input' (ATTR)* '>';

obody :    '<body' (ATTR)* '>';

 

CBODY :      '</body>';

OHTML :      '<html>';

CHTML :      '</html>';

otable :      '<table' (ATTR)* '>';

CTABLE :      '</table>';

o_tr :      '<tr' (ATTR)* '>';

C_TR :      '</tr>';

o_th_or_td :     ('<th' | '<td') (ATTR)* '>';

C_TH_OR_TD :   '</th>' | '</td>';

CFORM :      '</form>';

ATTR :      WORD ('=' (WORD ('%')? | ('-')? INT | STRING | HEXNUM))?;

HEXNUM :      '#' ('0'..'9' | 'a'..'f')+;

INT :      (DIGIT)+;

DIGIT :      '0'..'9';

WORD :      (LCLETTER | '.' | '/')  (LCLETTER | DIGIT | '.')+;

STRING :      '"' (~'"')* '"' | '\'' (~'\'')* '\'';

LCLETTER :     'a'..'z';

WS : ( ' ' | '\t' | '\n' | '\r' ) + {Skip();} ;

这个可运行的简化的HTML文法中只支持<form>表单和<table>表格。O开头的符号如OHTML、otable表示标记开头<html>和<table>,C开头的符号是表示结束标记如:CHTML,CTABLE表示</html>和</table>。document规则表示整个HTML文档其包括body部分。Body主要包括两种内容text和body_tag,body_tag中包括<table>表格,text中包含<form>表单。词法规则可以和语法规则混合书写这是允许的。

文法中的th_or_td规则表示表格中的一个cell,其中又包含了body_content这个递归的定义使得表格中的第一个小格都可以嵌套的包含HTML标记。生成分析器后可以对下面的HTML文件进行分析。

<html>

<body id="doc">

<table>

  <tr>

    <td>

        <form action="login.jsp" >

            <input id="txt1" value="" />

        </form>

  </td>

  </tr>

</table>

</body>

</html>

 

4.7 Skip()的效果

在HTML文法示例中的开始标记的定义是用语法规则定义的,而结束是用词法规则定义的ANTLR中规则可以灵活定义不拘一格,结束标记只是固定的字符串定义成词法规则就可以了。而开始标记中要包含属性的定义所以用语法规则来定义。其中有一点要注意的是如果我们把开始标记也定义成词法规则会出现什么情况呢?如下面改变一下HTML文法。

OFORM : ‘<form’  (ATTR)*  ‘>’

将<form>表单的开始标记改为词法规则,这时分析器不能正确分析上面的html文件。在分析<form ation=””>行时异常。运行这个示例的语句如下:

HTMLLexer lex = new HTMLLexer(new ANTLRFileStream("t.html"));

ITokenStream tokens = new CommonTokenStream(lex);

HTMLParser parser = new HTMLParser(tokens);

HTMLParser.document_return dReturn = parser.document();

这是因为空白规则WS中的Skip()语句的效果是对语法分析而言的。在词法分析阶段Skip()并没有去掉空格,我们可以java和.net的开发环境中查看tokens对象了解词法分析阶段的结果,这可以帮助我们分析问题。对于输入的“<form ation="">”来说 form和ation之间有一个空格这时词法分析器会失败,因为我们在这个规则中没有定义空白,除非我们这样写这个词法规则。

OFORM : ‘<form’  WS  (ATTR)* WS? ‘>’

把所有可能出现空格地方都加下显示地定义空白才行。这也就是我们在上一章中的FuzzyJava2示例中为什么词法规则中加了很多WS的原因。

 

4.7 语法规则中的字符常量

可能读者早已发现我们在语法规则中直接写入了需要匹配的字符。如:

oform : '<form' (ATTR)* '>';

‘<form’和‘>’都属于词法范畴,ANTLR为了使书写简单直观,允许在语法规则中直接写出需要匹配字符。在生成分析器代码时这些常量会自动被放入词法分析程序中,语法分析程序中的字符串会用生成的序号代替。oform : '<form' (ATTR)* '>'与下面的写法是等价的。

oform : t10 (ATTR)* t11;

t10 :‘<form';

t11 : ‘>';

 

4.8 C-语言示例

C-语言是C语言的一个子集,是ANTLR的一个经典示例。下面看一下它的文法。

grammar CMinus;

program

    :   declaration+

    ;

declaration

    :   variable  |   function

    ;

variable

    :   type ID ';'

    ;

type:   'int'  |   'char'

    ;

function

    :   type ID

        '(' ( formalParameter (',' formalParameter)* )?  ')'

        block

    ;

formalParameter

    :   type ID

    ;

block

    :   '{' variable* stat* '}'

    ;

stat

: forStat  |  ifStat  |  expr ';'  |  block  |  assignStat ';'  |  ';'

    ;

ifStat

    : ‘if’  ‘(‘  expr  ‘)’  stat  (‘else’  stat)?

    ;

forStat

    :  'for' '(' assignStat ';' expr ';' assignStat ')'  block

    ;

assignStat

    :   ID '=' expr

    ;

expr:   condExpr ;

 

condExpr

    :   aexpr ( ('==' | '!=' ) aexpr )?

    ;

aexpr

    :   mexpr ('+'  mexpr)*

    ;

mexpr

    :   atom ('*'  atom)*

    ;

atom:   ID

    |   INT

    |   '(' expr ')'

    ;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ;

INT :   ('0'..'9')+ ;

WS  :  ( ' ' | '\t' | '\r' | '\n' )+ { $channel = HIDDEN; } ;

启始规则program 表示整个C-程序,declaration表示语言中的声明项,有函数和变量两种声明variable和function。变量声明由类型type加标识符ID组成,function函数声明是由返回类型type函数名ID和参数表'(' ( formalParameter (',' formalParameter)* )? ')',block为函数体。函数体内可以有变量variable和语句stat。

语句stat包括for语句forStat、表达式expr、语句块block和赋值语句assignStat。表达式expr和第一章中的HelloWorld示例类似推导顺序与操作符优先顺序同反,在表达式的末端规则atom有可出现标识符ID、整数INT和嵌套的子表达式,语句块block与函数体block是同一规则,这是一个递归定义使得语句块可以嵌套书写。

生成分析器代码编译运行,来分析如下的C-代码。

char c;

int x;

int foo(int y, char d) {

int i;

for (i=0; i!=3; i=i+1) {

x=3;

y=5;

}

     if(5 == 4)

       if(5 == 4)

i = 1;

else

i = 2;

}

 

4.9小结

本章讲述了ANTLR的语法分析,语法分析中的递归定义的应用,用SQL、java、HTML和C-几个实际的例子来让读者对语法分析有更好的理解。通过对Skip()效果的示例说明了词法部分的操作与语法分析的关系。

【Antlr】Antlr 使用语法分析树监听器编写程序、Antlr 解析 Properties 格式、监听器模式 出自:Antlr权威指南 并且进行补充。构建应用逻辑和语法松男合的语言类应用程序的关键在于,令语法分析器建立一棵语法分析树,然后在遍历该树的过程中触发应用逻辑代码。我们可以使用自己熟悉的方法遍历这样的语法分析树,也可以利用ANTLR自动生成的树遍历器。在本节中,我们将会使用ANTLR内貴的ParseTreeWalker构建一个与上一节类似的、基于监听器的属性文件处理程序。让我们从一个“干净”的、识别属性文件的语法开始。该语法树可以构建如下这种结构。 阅读详情

相关推荐

Redis+Unity 数据库搭建

游戏中需要存放排行榜等数据,而且是实时存放,所以就涉及到数据库的问题。这里找服务器大神了解到可以用Redis来做存储,免费的效率极高。

chaixinke的专栏 879

ANTLR4入门【打造你自己的语法规则】

antlr4学习,结合idea使用,java代码实现一个带括号的四则运算规则

qq_33129875的博客 1万+

HMC5883L磁力计驱动开发:I²C通信、校准与FreeRTOS集成

磁力计是惯性导航与电子罗盘系统的核心传感器,其输出原始磁场数据需经精确采集、单位换算与误差补偿才能用于姿态解算。基于各向异性磁阻(AMR)原理的三轴磁力计,如HMC5883L,依赖稳定I²C通信获取12位有符号磁场采样值,并通过增益配置、硬软铁校准及温度补偿提升物理量精度。在嵌入式实时系统中,驱动层须保障数据的时间一致性与抗干扰鲁棒性,避免总线挂死、字节错位或量程误配等典型问题。本文围绕HMC5883L这一广泛使用的停产但仍在产线服役的磁传感器,详解寄存器配置、定点单位转换、八方位校准算法及FreeRTOS

weixin_42594427的博客 145

ANTLR4基本语法

ANTLR4是一款非常灵活和强大的工具,可以支持多种语言的语法定义,并提供了丰富的语法规则和操作符来支持高级语言特性的定义和处理。一个ANTLR4文法由语法规则和词法规则组成,语法规则定义了语言的结构和语法,词法规则定义了语言中的词汇元素(Token)。使用ANTLR4可以大大简化语法解析器的开发难度,使得开发者可以更加专注于业务逻辑的实现,而无需手动编写和维护大量的语法规则和解析逻辑。其中,RULE_REF 是一个规则名称,ruleAltList 是一个或多个语法规则的定义,每个规则使用竖线 | 分隔。

Gavin_ke的博客 1713

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5382

推理篇第3节:TensorRT基础——Builder、Engine、ExecutionContext生命周期

TensorRT模型优化与推理流程摘要 TensorRT是NVIDIA的深度学习推理优化器,通过Builder、Engine和ExecutionContext三阶段实现高效推理。Builder负责编译模型,执行图优化和kernel选择;Engine是优化后的推理计划;ExecutionContext管理运行时执行。编译期进行重量级优化(如算子融合、kernel调优),运行时快速执行。TensorRT 10.x引入新API,推荐使用buildSerialized方法。构建流程包括创建Builder、网络定义、

PeterPan的博客 503

ANTLR4(四) 基础设计语法

ANTLR4基础设计语法写在之前语言模式序列选择词法符号依赖嵌套处理优先级、结合性、左递归优先级结合性左递归核心语法标记总结词法结构匹配标识符匹配数字匹配字符串常量匹配注释和空格核心词法规则总结 写在之前 对于ANTLR的.g4文件来说,它的格式一般如下: //xx.g4 grammar xx 文法1: 文法2: 文法... 词法规则 词法1: 词法2: ... 注意的几点: 文件名和grammar关键字后跟的语法名应该一致。 文法规则和词法规则可以同时存在一个文件中,但文法以小写开头,词法以大写

pourtheworld的博客 7637

项目介绍 MATLAB实现基于LSTM-XGBoost长短期记忆网络(LSTM)结合极端梯度提升(XGBoost)进行多变量时序预测的详细项目实例(含模型描述及部分示例代码)

本项目基于MATLAB平台,实现LSTM-XGBoost混合模型进行多变量时序预测。通过LSTM网络自动提取时序特征,结合XGBoost强大的回归能力,有效解决多变量时序数据的高维复杂性、长短期依赖捕捉等难题。项目包含完整的数据预处理流程、模型构建与训练方法,以及性能评估指标。提供的GUI界面支持参数调整、训练监控和结果可视化,适用于能源、金融、气象等多领域预测任务。配套代码详细注释,便于理解模型实现细节,为时序预测研究提供实用参考框架。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 101

ANTLR4详细介绍(二)语法规则

Antlr4的强大建立在灵活的语法定义和可扩展性的基础之上。这一版本新增了import功能,且语法(parser)、词法(lexer)可拆分成独立的文件,从而增加规则的可复用性。引入访问者、监听器模式,使解析与应用代码分离。语法规则表述也更为简单,更贴近自然语言的习惯。本文将以 Antlr4.9.3 版本为基础环境进行讲解。

kebin2012的博客 3706

2024年数字IC秋招-大疆-数字芯片开发工程师-笔试题

笔试题型:选择题 + 简答题笔试平台:大疆创新(电脑监控)笔试时间:90min做题感受:知识面覆盖很广,很多题目不会做(1) 什么是功耗优化中的DVFS技术?(2)降低功耗的原理是什么?(3)一般工作流程是怎样的?(4)必须的硬件模块有哪些?

qq_42135020的博客 2665

撸毛笔记-电信营业厅 v5.03

电信营业厅 v5.03签到和完成部分金豆任务, 喂宠物7天,15天,28天连签抽奖, 宠物等级权益兑换自己设置电信的服务密码, 把 手机号#服务密码 填到变量里:每天运行一两次const $ = new Env("电信营业厅");

xiaoshun007的专栏 4494

ANTLR 实战 SQL 词法/语法分析

ANTLR 实战 SQL 词法/语法分析 关于 词法/语法分析 和 ANTLR 语法 的详细内容,可参考我的另一篇博客:https://blog.youkuaiyun.com/pentiumCM/article/details/106076655。 本篇博客为实战入门速食篇,主要提供demo实战,不做太多内容展开。 一、准备工具 安装 ANTLR 环境: 推荐使用 ANTLR-4.8版本 参考资料:https://www.cnblogs.com/wynjauu/articles/9872822.html 二、实战

pentiumCM的博客 3764

【2025CSPJ普及组】T4. 多边形

【2025CSPJ普及组】T4. 多边形【题目描述】小 R 喜欢玩小木棍。小 R 有 n 根小木棍,第i(1≤i≤n) 根小木棍的长度为 ai。

lybc2019的博客 849

使用ANTLR进行语法分析

1 使用ANTLR 1.1 安装 1.2 运行并测试 2 ANTLR语法 2.1 构成 2.2 歧义 2.3 语法分析树 2.4 监听器 2.5 访问器

theVicTory的博客 2873

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Hive-技术补充-ANTLR词法语法分析

要清晰的理解一条Hql是如何编译成MapReduce任务的,就必须要学习ANTLR。下面是ANTLR的官方网址,下面让我们一起来跟着官网学习吧。

lu070828的博客 1264

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql词法分析antlr4_ANTLR 实战 SQL 词法/语法分析

文章目录ANTLR 实战 SQL 词法/语法分析一、准备工具二、实战环节1. 方式1:不借助外部 IDE2. 方式2:借助 idea参考资料ANTLR 实战 SQL 词法/语法分析关于 词法/语法分析 和 ANTLR 语法 的详细内容,可参考我的另一篇博客:https://blog.youkuaiyun.com/pentiumCM/article/details/106076655。本篇博客为实战入门速食篇,...

weixin_33603331的博客 1586

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring Boot集成antlr实现词法和语法分析

Antlr4 是一款强大的语法生成器工具,可用于读取、处理、执行和翻译结构化的文本或二进制文件。基本上是当前 Java 语言中使用最为广泛的语法生成器工具。Twitter搜索使用ANTLR进行语法分析,每天处理超过20亿次查询;Hadoop生态系统中的Hive、Pig、数据仓库和分析系统所使用的语言都用到了ANTLR;Lex Machina将ANTLR用于分析法律文本;Oracle公司在SQL开发者IDE和迁移工具中使用了ANTLR;NetBeans公司的IDE使用ANTLR来解析C++;

HBLOG 2027

antlr java语法分析_[转载] ANTLR——语法分析

语法分析是编译过程的第二步,在词法分析提供的记号流的基础上,对源代码的结构做总体的分析。无论分析的内容有多大语法分析总是由一个启始规则开始的,最后总是生成一棵语法树。一般情况语法规则是一个文法的主体部分,也是编写文法的难点。本章用几个示例来讲述如何用ANTLR定义语法规则。4.1语法分析的方法在ANTLR中语法分析定义的规则名必须以小写字母开始大写如“baseClass”,“subfixSymbo...

weixin_39601641的博客 511

[语法分析/编译原理] Antlr : 开源语法分析工具

例如,在上诉的例子中,乘除的优先级会比加减高。注释和空白字符:对于注释和空白字符,大多数情况下对于语法分析器是无用的(Python是一个例外,它的换行符表示一条命令的终止,特定数量的缩进指明嵌套的层级),因此我们可以使用ANTLR的skip指令来通知词法分析器将它们丢弃。类似hibernate中的HQL,用DSL来定义要执行操作的高层语法,这种语法接近人可理解的语言,由DSL到计算机语言的翻译则通过ANTLR来做,可在ANTLR的结构语言中定义DSL命令具体要执行何种操作。

weixin_55010563的博客 928

Antlr入门指南:从基础到应用

Antlr

道 1万+

antlr java语法分析_[转载] ANTLR——语法分析 - 6DAN - 博客园

语法分析是编译过程的第二步,在词法分析提供的记号流的基础上,对源代码的结构做总体的分析。无论分析的内容有多大语法分析总是由一个启始规则开始的,最后总是生成一棵语法树。一般情况语法规则是一个文法的主体部分,也是编写文法的难点。本章用几个示例来讲述如何用ANTLR定义语法规则。4.1语法分析的方法在ANTLR中语法分析定义的规则名必须以小写字母开始大写如“baseClass”,“subfixSymbo...

weixin_42659196的博客 810

ANTLR学习(二):ANTLR入门项目

文章目录前言一、项目简介二、ANTLR工具、运行库以及自动生成的代码三、将生成的语法分析器与Java程序集成四、构建一个语言类应用程序 前言 通过一个入门项目学习到: 一些ANTLR语法的语义元素定义 ANTLR根据语法自动生成代码的机制 如何讲自动生成的语法分析器和Java程序集成 如何使用语法分析树监听器辨析一个代码翻译工具 一、项目简介 构造一个语法,它为C语言或其继承者Java语法的一个很小的自己,我们将识别包括花括号或者嵌套的花括号的一些整数,例如 {1,2,3}和{1,{2,3},4}

weixin_52224421的博客 3320

Antlr4入门(四)监听器、访问器与语法分析树的标注

ANTLR的运行库提供了两种遍历树的机制:语法分析树监听器与访问器。通过它们,我们可以在遍历树的时候实现相应逻辑。在本章中,我们将通过编写一个简单的计算器来探究三种在事件方法中共享信息的途径。 一、计算器语法文件 按照上一章“Antlr4入门(三)如何编写语法文件”所学的内容,我们可以很轻松的写出一个只支持加法和乘法的计算器语法文件。 grammar ExprTest; cal : expr; expr : expr MUL expr # Mul | expr ADD exp.

qq_37771475的博客 7004
上一篇: Antlr指南(第三章 词法分析)
下一篇: antlr指南 第五章 嵌入文法的Actions
gaochunguang2021
博客等级 码龄19年 36粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值