当前位置: 首页 > 知识库问答 >
问题:

antlr文法定义

包丁雨
2023-03-14
start
 : orExpr
 ;

orExpr
 : orExpr OR andExpr
 | andExpr
 ;

andExpr
 : andExpr AND eqNotEqExpr
 | eqNotEqExpr
 ;

eqNotEqExpr
 : eqNotEqExpr NEQ compExpr
 | eqNotEqExpr EQ compExpr
 | compExpr
 ;

compExpr
 : compExpr LT compExpr
 | compExpr GT compExpr
 | compExpr LTEQ compExpr
 | compExpr GTEQ compExpr
 | notExpr
 ;

notExpr
 : NOT notExpr
 | parExpr
 ;

parExpr
 : OPAR orExpr CPAR
 | id
 ;

id
 : INT
 | FLOAT
 | TRUE
 | FALSE
 | ID
 | STRING
 | NULL
 ;
start
 : expr
 ;

expr
 : NOT expr                             //notExpr
 | expr op=(LTEQ | GTEQ | LT | GT) expr //relationalExpr
 | expr op=(EQ | NEQ) expr              //equalityExpr
 | expr AND expr                        //andExpr
 | expr OR expr                         //orExpr
 | atom                                 //atomExpr
 ;

atom
 : OPAR expr CPAR //parExpr
 | (INT | FLOAT)  //numberAtom
 | (TRUE | FALSE) //booleanAtom
 | ID             //idAtom
 | STRING         //stringAtom
 | NULL           //nullAtom
 ;
OR : '||';
AND : '&&';
EQ : '==';
NEQ : '!=';
GT : '>';
LT : '<';
GTEQ : '>=';
LTEQ : '<=';
NOT : '!';

OPAR : '(';
CPAR : ')';

TRUE : 'true';
FALSE : 'false';
NULL : 'null';

ID
 : [a-zA-Z_] [a-zA-Z_0-9]*
 ;

INT
 : [0-9]+
 ;

FLOAT
 : [0-9]+ '.' [0-9]* 
 | '.' [0-9]+
 ;

STRING
 : '"' (~["\r\n] | '""')* '"'
 ;

COMMENT
 : '//' ~[\r\n]* -> skip
 ;

SPACE
 : [ \t\r\n] -> skip
 ;

OTHER
 : . 
 ;

共有1个答案

宋唯
2023-03-14

这是ANTLR V4特有的。

在下面,像这样的规则将被重写为与您在左递归消除步骤中手动所做的相同的内容。ANTLR这样做是为了方便,因为LL语法不能包含左递归规则,因为将这种规则直接转换为解析器代码将在代码中产生无限递归(一个无条件调用自身的函数)。

在docs页面中有更多关于左递归的信息和转换示例。

 类似资料:
  • java-jar antlr-3.3-complete.jar-xmx8g-xwatchconversion sql2003lexer.g java-jar antlr-3.3-complete.jar-xmx8g-xwatchconversion sql2003parser.g javac antlrdemo.java java文件: 前两步工作正常,然后在编译主类时,我会遇到许多与Java语法

  • 我想在一个中央Antlr文件中定义公共令牌常量。这样,我就可以定义几个不同的lexer和parser,并在运行时混合和匹配它们。如果它们都共享一组共同的令牌定义,那么它们就可以正常工作。 换句话说,我想看到公共静态final int WORD=2 ,所以他们都同意“2”是一个单词。 我创建了一个名为CommonTokenDefs的文件。g4并添加了如下部分: 并包括 在我的每一个人身上。g4文件。

  • 问题内容: 因此,我一直在使用ANTLRv3.4在Eclipse中进行语法编写,并且已经编写了一个有效的语法,我想确保在编辑该语法时一切仍然有效。我可以每次都进入口译员的行列,但这似乎很浪费时间。 问题:我已经读过关于gunit的信息,但是它提供了下载gUnit的链接:(http://antlr.org/hudson/job/gUnit/org.antlr $ gunit / lastSucces

  • 问题内容: 我对ANTLR4还是很陌生,现在我想了解我们可能会用它定义哪种语法。 据我所知,ANTLR中有两种规则: 解析器规则 (小写单词)和 词法分析器规则 (大写单词)。例: 从语法生成规则的角度来看,我要说的是,解析器规则是NON-TERMINAL符号,可以用词法分析器规则定义的一系列标记替换。 因此,很明显,语法根据定义是上下文无关的。语法产生的语言的字母缩写包含所有由小写拉丁字母组成的

  • ANTLR(ANother Tool for Language Recognition)它是Java开发的词法分析工具,它可以接受词文法语言描述,并能产生识别这些语言的语句的程序。作为翻译程序的一部分,你可以使用简单的操 作符和动作来参数化你的文法,使之告诉ANTLR怎样去创建抽象语法树(AST)和怎样产生输出。ANTLR知道怎样去生成识别程序,语言包括 Java,C++,C#. Hibernat

  • 但是,它仍然溢出父文件夹中所有生成的文件。 附言。这应该无关紧要,但我的环境是macOS。