ANTLR: 文法分析利器

219. 使用ANTLR构建解析器 ANTLR(Another Tool for Language Recognition)是一个功能强大的解析器生成工具,广泛用于构建语言解析器、编译器前端和解释器。它能根据用户定义的语法规则自动生成词法分析器和语法分析器,支持多种目标语言(如Java、Python、C++等)。ANTLR 4采用LL(*)解析算法,可处理复杂语法和左递归,并提供可视化调试工具。其典型应用包括:开发领域特定语言(DSL)、配置文件解析、代码转换、静态分析以及自然语言处理等基础功能。ANTLR简化了语言处理流程,使开发者能专注于 阅读详情

转自(http://sishen.lifegoo.com/?p=5)


大学时, 写过不少需要文法分析的Project, 如MiniSQL的SQL语法, 简易计算器等. 从计算理论的角度来说, 相对于正则的孱弱. DFA对于文法的表达能力是简单强大的. 因此, 也就有了DFA的文法分析工具. 几乎每一本编译原理的书上, 都会提到Lex/Yacc这一对词法语法分析工具(如果没有, 就扔掉它, -,-). 30几年的历史, 也证明了Lex/Yacc的强大. 然而, 也正因为其历史, 使之的OO支持上存在着很大问题. 毕竟, C才是其母语. 所以, 新的工具ANTLR就自然地诞生了.

首先来介绍一下吧.
What is ANTLR?
ANTLR, ANother Tool for Language Recognition, (formerly PCCTS) is a language tool that provides a framework for constructing recognizers, compilers, and translators from grammatical descriptions containing Java, C#, C++, or Python actions.

究其源, ANTLR只是一个Java工具, 一个文法分析工具, 它提供了把相应rule生成包括Java,C++等语言的支持.

Q: How to use?

A: $java -cp $(antlr-jar-path) antlr.Tool example.g
然后就生成了相应的文件了.

相比于Lex/Yacc, ANTLR多了以下优点(个人使用感觉).

    • 面向对象的设计和面对对象的使用. OO的过程.
    • LL(k)语法. 比LALR, 更加的强大. 同时也没有了烦人的shift-reduce, reduce-reduce之类的语法冲突错误.
    • Error Handling. ANTLR是完全exception-driven的. 错误处理机制灵活健全. exception的最小粒度能得到具体token, 方便你在语法解析时控制系统的错误处理.
    • 生成后代码的可读性. 全部封装在对应的class里面, 便于阅读. 在语法的parser上, ANTLR使用了直观的switch/case来匹配token(而不是Yacc的parser table), 进而匹配这个规则, 类似于手动写一个DFA. 同时, 由于编译器对于switch的优化, 效率上并没多大影响.
    • 对语言的支持. 对于一个rule, 你可以方便的加入一段代码. 同时, 你可以很方便在规则之外加入类的成员变量, 类的成员函数(对于封装很有好处)以及全局的变量和函数等.
    • 生成后的代码使用简单. Simple Example: ExampleLexer lexer(cin); ExampleParser paser(lexer); parser.expr(); . 同时也可见, 易于封装.
    • 可以定义rule的返回值, rule的参数. 在rule relation的处理上更加地强大.
    • 提供了丰富的built-in function.
    • Unicode的支持. 你几乎不需要做额外的工作.

在官网里面, 还特别提到了一点:
ANTLR provides excellent support for tree construction, tree walking, and translation.
即对TreeParser和AST的支持. 不过由于我的语法很少需要用到TreeWalker, 没多少体会.

和很多词法语法分析软件一样,我也以一个简易计算器作为example。

计算器需求

  1. 运算符:+,-,×,÷,(,)
  2. 支持整型和浮点型

测试样例

  1. 1 + 2 * 3 + 5 - 4/2
  2. (1 + 2) * 3 + 5 - 4 / (2+2)
  3. (1.2*2.5)+8/(4-3)*2.7

下面就让我们动手完成一个计算器,:)
先搭个框架。文件名是calc.g

options {
language = “Cpp”;
}

class CalcParser extends Parser;

class CalcLexer extends Lexer;

这些就是基本框架了。
options里设置language为”Cpp”,表示要生成c++代码。
CalcParser是我们的计算器的语法解析类,继承ANTLR里的Parser类。
同理,CalcLexer是词法分析类,继承ANTLR里的Lexer类。


接着定义计算器的词法规则。

首先是运算符。
PLUS : ‘+’;
SUB : ‘-’ ;
MUL : ‘*’ ;
DIV : ‘/’ ;
LPAREN : ‘(’ ;
RPAREN : ‘)’ ;

接着是操作数。
NUM : (’0′..’9′)+ { $setType(INT); } (’.’ (’0′..’9′)+ { $setType(REAL); } )? ;

(注:这里解释一下NUM这个规则。$setType是 ANTLR内置函数,用来设置token类型。所以这个规则的意思就是当匹配到(’0′..’9′)*后,设置token类型为INT,当发现后面跟着小 数点和数字后,重新设置token类型为REAL。相信细心的读者会有这种疑问,为什么不用两条规则,通过有无’.'来匹配。关于这点,我们来回忆一下, ANTLR是采用LL(*),目前的release版本2.7.6只支持fixed-length lookahead,所以用两条规则会引起ambiguity。可以查看我在(I)里的回复,有更详细的描述。)


当然,我们还希望忽略空格,制表符,回车换行这种无意义字符的。
WS : (’ ‘
| ‘/t’
| ‘/n’
| ‘/r’)+
{
$setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);
}
;

到这里为止,我们的词法规则就完成了。下面就是语法规则。先来分析一下运算符。显然,(×/÷)>(+/−)。(,)用来组合式子。

至此,语法规则也呼之欲出了。

statement : mexpr ( (PLUS | SUB) mexpr )*
;
mexpr : expr ( (MUL | DIV) expr )*
;
expr : INT
| REAL
| LPAREN statement RPAREN
;

all done。一个计算器的语法程序就写好了。让我们来生成c++代码,实际测试一下.
$java -cp /usr/share/java/antlr.jar antlr.Tool calc.g
ANTLR Parser Generator Version 2.7.6 (20060528) 1989-2005
$ls
calc.g CalcParser.cpp CalcParserTokenTypes.txt
CalcLexer.cpp CalcParser.hpp
CalcLexer.hpp CalcParserTokenTypes.hpp
$
我们可以看到,生成了6个文件。有兴趣的可以自己看一下,每个文件的可读性是很强的,:)。
我们写个CalcTest.cpp:

#include “CalcLexer.hpp”
#include “CalcParser.hpp”
#include
using namespace std;
using namespace antlr;

int main()
{
try {
CalcLexer lexer(cin);
CalcParser parser(lexer);
parser.statement();
} catch (exception &e) {
cout << e.what() << endl;
}
}

编译之:
$g++ -o Calc CalcTest.cpp CalcParser.cpp CalcLexer.cpp -lantlr

让我们来跑一下测试用例吧,:p

$ ./Calc
1 + 2 * 3 + 5 - 4/2
$ ./Calc
(1 + 2) * 3 + 5 - 4 / (2+2)
$ ./Calc
(1.2*2.5)+8/(4-3)*2.7
$

顺利通过,一切都是那么的自然,lol~。ok, 来些错误的。

$ ./Calc
(1+(1+3.5*(3-2))
line 1:18: expecting RPAREN, found ‘’

可以从错误中看到,还有一个没有匹配的’('。 有兴趣的话你就自己测试吧,:)

至此,我们的计算器的有语法解析部分基本已经完成,剩下的就是如何得到计算结果,这个留在后续文章吧。

关于终结符.

在statement的规则里, 我们并没有设置终结符, 同时由于我们忽略了空格,制表符,回车, 所以在stdin状态下, 规则是无法终结的, 需要我们自己输入”EOF”来终止. 也就是结束lexer和parser. 使程序中止, 如文章中的例子所示.

ANTLR也自带了EOF特殊符. 最简单的是

statement : mexpr ( (PLUS | SUB) mexpr )* EOF
;

我之所以没用是我希望在后面的文章中用’='来表示终结. 这里就手动输入EOF好了.

完整的程序可以从这里下载:calc.tar.gz
enjoy yourself! Any advice prefer.


强烈推荐一下.

官方网址: http://www.antlr.org/
maillist: antlr-interest@antlr.org

 另外一篇:
利用ANTLR生成C++描述的分析程序
转自: http://dev.youkuaiyun.com/author/guocongbin/163a27f92a264a54ab61ba00078d6489.html

摘要

ANTLR(ANother Tool for Language Recognition)是一种基于LL(k)文法的语法分析程序(以下简称分析器)生成工具。其生成的分析器默认使用Java描述,而不是更高效的C++。本文介绍了在Windows平台下,借助VC6.0进行组织工程,使用ANTLR生成C++描述的分析器的方法,并给出了一个实例。最后,本文对ANTLR本身做出了一点小小的改进。

关键字

ANTLR,语法分析器,语法分析器生成工具

ANTLR简介

分析器的自动生成一直是编译理论研究的一个方向。早期的程序员手工编写分析器,不但费时费力,而且编写的分析器不稳定、不易修改和移植。在自动化大潮冲击之下,越来越多的程序员抛弃了这种手工做法。

由旧金山大学的Terence Parr 领导开发的ANTLR(以前叫做PCCTS,Purdue Compiler Construction Tool Set,普渡大学编译器构建工具集)是一种分析器自动生成工具,它可以接受语言的文法描述,并能产生识别这些语言的程序。而且我们可以在文法描述中插入特定的语义动作,告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。

现在ANTLR越来越流行(有评论说ANTLR的出现是一个里程碑),不仅因为它功能更强、容易扩展、开源,而且ANTLR生成的代码和使用递归下降方法(手工生成分析器的主要方法)生成的代码很相似,易于阅读理解。与之相比,另外一种著名的分析器生成工具YACC(Yet Another Compiler-Compiler,基于LR分析方法)生成的程序就比较晦涩。

目前国内介绍ANTLR的文章不多,仅有的文章也是介绍使用ANTLR生成使用java描述的分析器。其实ANTLR也可以生成C++描述的源程序(从2.7.3版本开始,ANTLR开始支持C#,将来还会支持Python),不过需要一些准备工作。本文将详细地介绍其中的具体步骤。

最新版本的ANTLR可以去ANTLR的官方网站(http://www.ANTLR.org)下载。截止到2004年6月,ANTLR的最新版本是2.7.4。下载的文件是一个不到1.3M的tar.gz形式的压缩包,将其解压到某个目录(下文用<ANTLRpath>表示)。

ANTLR是使用Java开发的,需要JDK的支持。本文假设您的机器已经安装JDK,并正确设置了classpath。

文法文件

文法就是语言识别的规则。它是ANTLR生成程序的依据。文法文件是ANTLR的核心,是程序员和ANTLR进行交流的接口。

文法文件的编写基本是面向被解决的问题的。程序员只需要集中精力思考解决问题的逻辑,而不是羁绊于某种程序设计语言的实现细节,因此降低了出现错误的可能性。

文法文件的语法简介

本文只是简单地介绍一个文法文件的语法,具体内容可以参阅ANTLR的相关文档。

文法文件一般包括header块、options块、文法分析器类(parser)及规则定义、词法分扫描器类(lexer)及token定义。其中最为重要的是规则和token的定义。

规则的定义形式和编译理论中的扩展巴科斯范式(EBNF)极为相似,包括规则名、规则体、一个用作结束标志的分号和异常处理部分(可省略)。例如如下的规则就描述了C语言中的赋值语句的语法:

assignment_stat:

     id '=' expr ';'

     ;

其意义是:一条赋值语句是由一个id、一个等号、一个表达式和一个分号顺序组成的。

Token的定义方法与规则类似。例如如下的token定义就表示一个十进制的整数:

NUM:

     ('1'..'9')('0'..'9')*

     ;

其意义是:数字(NUM)的第一字符是‘1’到‘9’中的一个字符,后面是0个或多个‘0’到‘9’之间的字符。

需要注意的一点是:规则的名字必须是小写字母开始,而token的名字则必须是大写字母开始。

设定ANTLR生成的语言

ANTLR有很多选项,可以通过在文法文件中的options块中进行设置,其中包括ANTLR最终生成的语言。如果要生成C++描述的分析器程序,就要如下设定:

options

{

language="Cpp";

// Other options

}

language选项的默认值是“Java”。如果您希望生成的程序是C#的,将language设为“Csharp”就可以了。

C++程序的例子

下面就给出一个ANTLR生成的C++描述的分析器的实例。该分析器的功能是分析用户输入的一个算术表达式,给出该表达式的最终结果。在该表达式中允许出现的运算符除了加减乘除之外,还包括求幂运算符“^”,以及sin、cos和tan三个三角函数。

在开始之前,我们首先要生成编译链接ANTLR生成的程序时需要的库文件。

构建静态链接库

构建(build)由ANTLR生成的C++程序需要一个运行库的支持。该运行库的源代码也是完全开放的,位于<ANTLRpath>/antlr-2.7.4/lib/cpp目录下。我们可以选择这些代码其编译为静态链接库或者动态链接库。对于2.7.4版本的ANTLR,编译动态链接库需要VC7.0以上的编译环境。这里我们将其编译为静态库。

首先使用VC6.0新建一个名为ANTLRLib的Win32的静态链接库的工程,不要选择“Pre-compiled Header”和“MFC support”选项。

点击菜单“Project”à“Add to Project”à“Files…”,将Antlr-2.7.4/lib/cpp/src下面的除了dll.cpp之外的所有文件加入到工程中(注意一定不要加入dll.cpp,否则无法通过编译)。

为了让VC6.0找到所需要的头文件,需要将<ANTLRpath>/antlr-2.7.4/lib/cpp加入到头文件搜索路径中。具体方法是点击“Project”à“Settings…”,在弹出的对话框中选择“Debug”标签页,在下拉列表中选择“Preprocessor”,在“Additional include path”中,如图填入:

         <ANTLRpath>/antlr-2.7.4/lib/cpp

此时build整个工程,就可以生成ANTLR的运行库文件ANTLRLib.lib(有些文档说需要在工程设置中开启RTTI选项,但是似乎不这样做也没有太大的影响)。

编写文法文件

根据需求,不难写出如下的文法文件:

header{

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

}

 

options

{

    language="Cpp";

}

 

class ExprParser extends Parser;

{

}

 

// rules

expr returns [double value=0]

{double x;}

    :

    value=term

    (

    PLUS x=term {value+=x;}

    |

    MINUS x=term{value-=x;}

    )*

    ;

exception

    catch [ANTLR_USE_NAMESPACE(antlr)ANTLRException& ex] {

        // catch all exceptions and report it

        reportError(ex.toString());

    }

 

term returns [double value=0]

{double x;}

    :

    value=factor

    (

    STAR x=factor {value*=x;}

    |

    SLASH x=factor { value /= x;}

    )*

    ;

 

factor returns [double value =0 ]

{double x;}

    :

    value = atom

    (

    TOK_POW x = atom { value = pow(value,x); }

    )*

    ;

 

atom returns [double value=0]

{double x;}

    :

    i:NUM

    {

        value=atof((i->getText()).c_str());

    }

    |

    TOK_SIN x = atom { value = sin (x);}

    |

    TOK_COS x = atom { value = cos (x);}

    |

    TOK_TAN x = atom { value = tan (x);}

    |

    LPAREN value=expr RPAREN

    ;

exception

    catch [ANTLR_USE_NAMESPACE(antlr)ANTLRException& ex] {

        reportError(ex.toString());

    }

 

class ExprLexer extends Lexer;

options{

    k=1;

    caseSensitive = false;

}

 

// tokens

LPAREN  :'(';

RPAREN  :')';

PLUS    :'+';

MINUS   :'-';

STAR    :'*';

SLASH   :'/';

NUM     :('0'..'9')('0'..'9')*('.'('0'..'9')*)?;

RETURN  :'/n';

 

// math token

TOK_SIN :"sin";

TOK_COS :"cos";

TOK_TAN :"tan";

TOK_POW :'^';

 

// white space

WS  :

    (

    ' '

    |

    '/t'

    )

    {$setType(ANTLR_USE_NAMESPACE(antlr)Token::SKIP);}

    ;

 

将该文件保存为test.g(‘g’是默认的文法文件的扩展名)。

在该文法文件中,定义了一个分析器类ExprParser和一个词法扫描器类ExprLexer。ANTLR会为两个类分别生成头文件和实现文件。

使用VC6.0组织工程

现在需要由文法文件生成分析器的源代码,然后再添加其他的一些代码,最后编译这些代码,过程略显繁琐。因此这里借助VC6.0作为开发环境来组织工程,简化步骤。

新建工程

使用VC6.0新建一个名为AntlrCpp的Win32控制台的项目。选择新建一个空的工程。点击“Project”à“Add To Project”à“Files”,将文法文件test.g添加到工程中。

在VC的FileView中右键点击该文法文件,在弹出菜单中选择“Settings…”,弹出如图所示的对话框,选择“Custom Build”标签页,如图所示:

在“Commands”里面填入调用ANTLR编译文法文件的命令:

         java -cp  <ANTLRpath>/antlr-2.7.4/antlr.jar antlr.Tool -o "$(WkspDir)" $(InputName).g

在“Outputs”里面填入ANTLR编译文法文件后要生成的所有文件的名字,如下:

         ExprLexer.cpp     

         ExprLexer.hpp

         ExprParser.cpp

         ExprParser.hpp

         ExprParserTokenTypes.hpp

         ExprParserTokenTypes.txt

生成分析器源代码

设置完成之后,就可以编译该文法文件了:选中该文法文件,按Ctrl+F7(或者点击工具栏中的编译按钮),执行编译操作。在VC的Output窗口里面会显示出如下的内容:

         --------------------Configuration: AntlrCpp - Win32 Debug--------------------

         Performing Custom Build Step on ./testjava.g

         ANTLR Parser Generator   Version 2.7.4   1989-2004 jGuru.com

        

         ExprLexer.cpp - 0 error(s), 0 warning(s)

此时,分析器的源代码已经生成。再次点击菜单“Project”à“Add To Project”à“Files”,将生成的所有cpp文件和hpp文件添加到工程中。

指定输入方式

ANTLR生成的源代码只是分析器的核心部分,程序员还需要指定分析器的输入。为此还需要新建一个main.cpp文件,指定分析器的输入。

若希望让分析器分析通过键盘输入的字符串,则代码如下:

         #include "ExprParser.hpp"

         #include "ExprLexer.hpp"

         #include <iostream>

         using namespace std;

         void main()

         {

              ExprLexer lexer( cin );

              ExprParser parser( lexer );

              double x = 0;

              x = parser.expr();

              cout << "The Result is :" << x << endl;

         }

若希望让分析器分析一个文件里面的字符串的话,则相应代码如下:

         #include "ExprParser.hpp"

         #include "ExprLexer.hpp"

         #include <iostream>

         #include <fstream>

         using namespace std;

         void main()

          {

               fstream from("test.in");

               ExprLexer lexer(from);

               ExprParser parser( lexer );

              double x = 0;

              x = parser.expr();

              cout << "The Result is :" << x << endl;

         }

编译得到最终的结果

在构建工程之前,也需要让VC6.0知道上哪里去找所需的头文件。添加头文件搜索路径的方法前面已经介绍过,不再赘述,如图所示。

如果现在就Build工程的话,您一定会看到很多的链接错误。这是因为编译后的目标文件没有和运行库链接在一起。指定链接库的方法是在上面的设置工程属性的对话框中选择“Link”标签页,在“Object/library modules:”中加入“antlrlib.lib”(要注意正确的路径)。

此时就可以Build整个工程了。生成的可执行文件运行的效果如图所示:

对ANTLR一个小小改进

ANTLR的下载文件中包括了全部的源代码,而且允许修改。我们可以针对自己的特殊需要改进ANTLR。

问题的提出

如果在某条规则(经过ANTLR编译后就会变为一个函数)中,指定了参数的默认值,那么在生成的程序中,我们可能看到相应函数的实现中,隐去了该参数的默认值(否则就会违反C++的语法)。但是考虑到程序的可读性,我们希望做出一点改进:在函数实现中,将参数的默认值使用注释符号(“/*”和“*/”)括起来,而不是完全的隐去。

代码的修改

找到<ANTLRpath>/antlr-2.7.4/antlr/cppcodegenerator.java文件,修改其3502行到3526行。原来的程序为:

String oldarg = rblk.argAction;

String newarg = "";

 

String comma = "";

int eqpos = oldarg.indexOf( '=' );

if( eqpos != -1 )

{

     int cmpos = 0;

     while( cmpos != -1 )

     {

         newarg = newarg + comma + oldarg.substring( 0, eqpos ).trim();

         comma = ", ";

         cmpos = oldarg.indexOf( ',', eqpos );

         if( cmpos != -1 )

         {

              // cut off part we just handled

              oldarg = oldarg.substring( cmpos+1 ).trim();

              eqpos = oldarg.indexOf( '=' );

         }

     }

}

else

     newarg = oldarg;

 

println( newarg );

修改如下:

String oldarg = rblk.argAction;

String newarg = "";

 

String comma = "";

int eqpos = oldarg.indexOf( '=' );

if( eqpos != -1 )

{

     int cmpos = 0;

     while( cmpos != -1 )

     {

         newarg = newarg + comma + oldarg.substring( 0, eqpos ).trim() + " /* ";

         comma = ", ";

         cmpos = oldarg.indexOf( ',', eqpos );

         if( cmpos != -1 )

         {

              // get the default value of the argument

              newarg = newarg + oldarg.substring( eqpos, cmpos ) + " */ ";

              // cut off part we just handled

              oldarg = oldarg.substring( cmpos+1 ).trim();

              eqpos = oldarg.indexOf( '=' );

         }else {

              newarg = newarg + oldarg.substring( eqpos ).trim() + " */";

         }

     }

}

else

     newarg = oldarg;

 

println( newarg );

重新编译ANTLR

重新编译ANTLR的步骤是:

开启一个命令行的环境,改变当前路径为<ANTLRpath>/antlr-2.7.4/antlr/build,输入如下命令:

         javac *.java

然后改变当前路径为<ANTLRpath>/ antlr-2.7.4,输入如下命令,编译源程序:

         java -cp  <ANTLRpath>/antlr-2.7.4/antlr.jar antlr.build.Tool build

最后重新生成jar文件,输入如下命令:

         java -cp  <ANTLRpath>/antlr-2.7.4/antlr.jar antlr.build.Tool jar

至此,ANTLR已经被更新。

总结

经过本文的介绍,相信您对ANTLR有了更多的了解。充分利用ANTLR可以极大的减轻编写分析的负担。结合高效的C++,ANTLR生成的分析器的效率和手工编写的分析器相差不多。相信ANTLR会有美好的明天。 

编译原理Antlr教程 BIT编译原理 Antlr教程 阅读详情

相关推荐

13、解析器生成利器:ANTLR4入门与实践

本文介绍了ANTLR4的基本概念、优势以及如何使用它生成解析器,包括构建简单表达式求值器和JSON解析器的具体示例。文章还讨论了ANTLR4与其他解析器生成工具的对比、优化技巧及常见问题解答,帮助开发者快速掌握这一强大工具的应用。

rl6adventurer的博客 154

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

Antlr

道 1万+

antlr v2.7.4 manual

ANTLR v2.7.4英文版参考手册

解析器生成器 ANTLR的详细介绍

ANTLR诞生的背景是,当时的语言工具包大多数都是基于YACC和LEX等老旧技术,无法支持新的编程语言和复杂的语法规则,同时,它们的性能和可扩展性也受到一定的限制。根据SQL语句的各个部分和解析结果,我们可以记录和分析SQL执行情况,包括执行的时间、执行的参数、执行的结果等信息。解析输入的SQL语句。另外,在自然语言处理领域中,还有许多其他的类似ANTLR的语言工具,例如Stanford Parser、NLTK、SpaCy等,它们都能够用于自然语言文本的处理和分析,提高自然语言处理的效率和准确性。

G探险者的博客 4998

从临床试验到互联网AB测试:边缘结构模型(MSM)如何解决‘时依性混杂’这个老大难问题

本文探讨边缘结构模型(MSM)如何解决时依性混杂问题,适用于临床试验和互联网AB测试。通过逆概率加权(IPTW)等方法,MSM能有效剥离混杂效应,准确评估长期干预效果。文章结合跨领域案例,详细解析MSM的核心原理、实施步骤及在推荐算法效果评估中的实战应用,帮助读者掌握这一先进因果推断工具。

weixin_28725949的博客 206

SAP MTS计划策略40实战:如何配置‘带最终组装的计划‘提升定制化生产效率

本文深入解析SAP计划策略40(带最终组装的计划)的核心机制与实战配置。该策略通过“需求消耗”与“组装灵活性”,有效融合按库存生产(MTS)与按订单生产(MTO)的优势,帮助制造企业在保持通用组件库存稳定的同时,快速响应客户的定制化需求,从而提升生产效率与客户满意度。

ruby5的博客 967

Antlr4 快速入门 - 编写语法解析器

Antlr全称(ANother Tool for Language Recognition),Antlr4是一款强大的语法分析器生成工具,推特,Haddop,Oracle等各大知名公司在用到了Antlr来构建自己的语言处理类项目。一门语言的正式描述称为语法(grammar),Antlr可以为语言生成一个词法分析器,并且自动建立语法分析树,也能自动生成树的遍历器,然后我们就可以访问树的节点,执行自定义业务逻辑代码。本文主要是介绍Antlr4的使用,因此不过多的介绍其特性和各种使用方式,以简单的Demo来了解下

BASK2312的博客 6568

DeepL Pro免费使用技巧与API调用优化方案

机器翻译技术通过神经网络模型实现跨语言语义转换,其核心价值在于保持专业术语准确性的同时实现自然语言流畅度。现代翻译工具如DeepL采用注意力机制等深度学习技术,在医疗、法律等专业领域展现出接近人工翻译的质量。针对API调用场景,开发者可通过请求模拟实现小批量自动化处理,而文档预处理和术语库优化则能显著提升免费额度使用效率。本文重点解析如何通过字符计算优化、临时接口调用等工程实践方法,在合规前提下最大化利用免费翻译资源。

weixin_29038303的博客 265

cpp lexer java_ANTLR: 文法分析利器 (Ⅱ)

在(I)里,我已经简单介绍了ANTLR。现在,让我们继续ANTLR之旅,来真实感受一下它的强大。和很多词法语法分析软件一样,我也以一个简易计算器作为example。计算器需求运算符:+,-,×,÷,(,)支持整型和浮点型测试样例1 + 2 * 3 + 5 - 4/2(1 + 2) * 3 + 5 - 4 / (2+2)(1.2*2.5)+8/(4-3)*2.7下面就让我们动手完成一个计算器,:)先...

weixin_32141627的博客 279

让 IF 更好读:在 ABAP 里尽量使用正向条件的实战指南

摘要:SAP系统开发中,代码可读性与可维护性的关键往往在于条件判断的写法。Clean ABAP风格指南建议尽量采用正向表达的条件判断,如使用has_entries = abap_true而非否定式写法。正向表达能降低理解成本,避免"否定的否定"带来的逻辑混乱,但不应为追求正向而制造空分支。在团队协作中,正向条件更利于代码评审和测试覆盖,建议通过工具检查和智能评审确保规范执行。落地时可关注变量命名正向化、避免空分支、主流程清晰展开等要点,以提升长期维护效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 245

星载SAR的各项指标解读(史上最全)

一、系统指标 系统指标主要指雷达系统的通用的指标,以及和卫星整星相关的指标,主要有一下几项: 工作频段: 雷达体制: 极化方式: 设计s

9271

ANTLR Kotlin:多平台语法解析的利器

ANTLR Kotlin:多平台语法解析的利器 项目介绍 ANTLR Kotlin 是一个为 Kotlin 语言量身定制的 ANTLR 插件和运行时库。它不仅支持在 JVM(包括 Android)上运行,还能在浏览器、Node.js 以及 Mac、Windows 和 Linux 的原生环境中运行。这意味着开发者可以使用 Kotlin 编写跨平台的语法解析器,极大地扩展了应用场景。 项目技术分析 K...

gitblog_01013的博客 920

python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法

出现该Bug的原因主要是 账号密码无法登录,但原先使用该代码测试qq或者163的时候是可以通过的!问题在于各个公司邮件所处理的代码方式不一样

码农研究僧的博客 3503

ANTLR4: CORBA IDL、C++ 语法文件分析利器

摘要: ANTLR4是一款强大的语法解析器生成工具,通过.g4语法文件自动生成词法分析器(Lexer)、语法分析器(Parser)、解析树(AST)及遍历接口(Listener/Visitor),显著降低自定义或现有语言解析的开发成本。其核心优势包括跨语言支持(Java/Python/C++等)、易读的类EBNF语法、完善的错误处理,以及官方grammars-v4仓库提供的数百种预置语法(如C++、SQL、Protobuf)。典型应用涵盖源码解析、DSL设计、接口语言处理等。 工作流程: 词法分析:源码→T

红军不怕远征难,万水千山只等闲 632

【25届数字IC秋招总结】面试经验7——联发科

25届数字ic面试记录——联发科

lalala0635的博客 981

USB2.0协议解读

就写到这吧,其他协议层等属于软件需要了解的东西了。简单看了下,本文总结的有点乱,有两个原因吧,其一是理解的不够透彻,无法用简单明了的语言总结;其二是感觉这个协议文档章节划分的也不是很好,有点大杂烩。

qflook的博客 3673

初识 ANTLR4:构建强大解析器的利器

ANTLR4 是一款广泛使用的解析器生成工具,它允许开发者通过定义语法规则来自动生成解析器代码。ANTLR4 支持多种编程语言,并且能够处理从简单数据格式到复杂编程语言的各种输入。其直观的语法定义语言和强大的错误处理机制,使得 ANTLR4 成为开发语言识别和处理系统的首选工具。ANTLR4 作为一款功能强大且易于使用的解析器生成工具,广泛应用于编程语言的编译器和解释器、数据格式解析、协议解析等领域。通过定义语法规则,ANTLR4 能够自动生成高效的解析器,帮助开发者快速构建语言识别和处理系统。

weixin_37600397的博客 1118

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

探索ANTLR4-SqlBase:构建高效SQL解析器的利器

探索ANTLR4-SqlBase:构建高效SQL解析器的利器 在数据驱动的世界里,SQL(结构化查询语言)是开发者与数据库进行交互的核心工具。对于需要处理、解析或生成SQL的应用来说,拥有一款强大的SQL解析器至关重要。这里我们要介绍的是项目,它基于ANTLR4工具,提供了一个全面的SQL语法解析器,能够帮助开发者轻松理解和操作SQL语句。 项目简介 ANTLR4-SqlBase是一个开源项目,由...

gitblog_00050的博客 1409

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C#用ANTLR4实现加减乘除小学生数学利器,高级程序员思想

主要使用C#,ANTLR4,winform实现改效果小学生的高等数学,智能计算器,主要学习思想,高等程序员必备思想,有更好想法的欢迎发表看法先看效果图:如下文法示例,专业术语文法,不懂留言或者多多百度和××× 整个加减乘除的词法的语法就由以下几行的antlr4代码来实现,先贴在下面:/** * Define a grammar called Hello */// 以下以小写字...

weixin_34205076的博客 761

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ANTLR4 安装与测试

antlr4的安装与图形测试

y18500941166的博客 531

【亲测免费】 探索语言解析的利器:ANTLR4权威指南中文版资源推荐

探索语言解析的利器:ANTLR4权威指南中文版资源推荐 【下载地址】ANTLR4权威指南中文版资料分享指南 本文档整合了来自优快云博客的精华内容,由博主“学点儿啥”整理分享,旨在帮助大家更好地理解和掌握ANTLR4的使用技巧。它不仅涵盖了ANTLR4的基础知识,还提供了实用的教程链接和一个直接的下载通道,使得获取权威指...

gitblog_06579的博客 645

用ANTLR4实现加减乘除小学生数学利器,高级程序员思想

主要使用ANTLR4实现改效果小学生的高等数学,智能计算器,主要学习思想,高等程序员必备思想,有更好想法的欢迎发表看法先看效果图:如下文法示例,专业术语文法,不懂留言或者多多百度和FQ整个加减乘除的词法的语法就由以下几行的antlr4代码来实现,先贴在下面: /*** Define a grammar called Hello*/ // 以下以小写字母开头的文法表示为语法元素 // 由大写字...

weixin_30505751的博客 249

自研 DSL 神器:万字拆解 ANTLR 4 核心原理与高级应用

ANTLR 是构建领域特定语言(DSL)的核心工具,通过自动生成词法/语法分析器简化语言处理。支持监听器、访问器等机制,实现高效语法解析和错误恢复,彻底革新DSL开发范式。

BookSea的博客 1238

探索智能合约的新维度:基于ANTLR4的Solidity解析器

探索智能合约的新维度:基于ANTLR4的Solidity解析器 项目地址:https://gitcode.com/gh_mirrors/so/solidity-parser-antlr 在这个区块链技术飞速发展的时代,Solitiy作为以太坊智能合约的首选语言,其重要性不言而喻。为了更好地理解、审计和自动化处理Solidity代码,今天我们将探索一款强大的工具——solidity-parser-a...

gitblog_00057的博客 556

ANTLR4 C++实战:从语法定义到DSL构建的完整指南

在计算机科学领域,解析器生成器是处理文本解析、编译器前端构建和领域特定语言(DSL)开发的核心工具。其工作原理是通过形式化的语法规则自动生成词法分析器和语法分析器,从而将字符序列转换为结构化的语法树。这一技术价值在于极大提升了开发效率,避免了手写解析器的复杂性和维护成本,使得开发者能够专注于语言设计和业务逻辑。在应用场景上,它广泛用于配置文件解析、自定义查询语言、数据格式转换以及嵌入式脚本引擎等。本文聚焦于ANTLR4在C++项目中的工程实践,详细介绍了如何通过定义接近BNF的语法规则,自动生成高效的C++

weixin_32956805的博客 334
上一篇: 完整的VB.NET的语法解析程序
下一篇: MapGIS6.X和ArcGIS9.0数据转换研究
NewMap
博客等级 码龄19年 122粉丝 204原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值