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

分别使用ANTLR解析器和Lexer

高恺
2023-03-14

我使用ANTLR Version4创建编译器。第一阶段是Lexer部分。我创建了“compilerlexer.g4”文件,并在其中输入了lexer规则。

compilerlexer.g4:

lexer grammar CompilerLexer;

INT         :   'int'   ;   //1
FLOAT       :   'float' ;   //2
BEGIN       :   'begin' ;   //3
END         :   'end'   ;   //4
To          :   'to'    ;   //5
NEXT        :   'next'  ;   //6
REAL        :   'real'  ;   //7
BOOLEAN     :   'bool'  ;   //8
.
.
.
NOTEQUAL    :   '!='    ;   //46
AND         :   '&&'    ;   //47
OR          :   '||'    ;   //48
POW         :   '^'     ;   //49
ID          : [a-zA-Z]+ ;   //50




WS
:   ' ' -> channel(HIDDEN)  //50
;
parser grammar CompilerParser;

options {   tokenVocab = CompilerLexer; }

STATEMENT   :   EXPRESSION SEMIC
        |   IFSTMT
        |   WHILESTMT
        |   FORSTMT
        |   READSTMT SEMIC
        |   WRITESTMT SEMIC
        |   VARDEF SEMIC
        |   BLOCK
        ;

BLOCK       : BEGIN STATEMENTS END
        ;

STATEMENTS  : STATEMENT STATEMENTS*
        ;

EXPRESSION  : ID ASSIGN EXPRESSION
        | BOOLEXP
        ;

RELEXP      : MODEXP (GT | LT | EQUAL | NOTEQUAL | LE | GE | AND | OR) RELEXP
        | MODEXP
        ;

.
.
.

VARDEF      : (ID COMA)* ID COLON VARTYPE
        ;

VARTYPE     : INT
        | FLOAT
        | CHAR
        | STRING
        ;
compileUnit
:   EOF
;
    null

有几十个这样的警告和错误。病因是什么?

一般问题:使用组合语法和单独使用lexer和parser有什么不同?如何连接单独的语法和lexer文件?

共有1个答案

裴昊阳
2023-03-14

Lexer规则以大写字母开头,解析器规则以小写字母开头。在解析器语法中,不能定义令牌。而且由于ANTLR认为所有的大写规则都是lexer规则,所以它会产生这些错误/警告。

用户2998131写道:

一般问题:使用组合语法和单独使用lexer和parser有什么不同?

grammar P;

r1 : 'foo' r2;

r2 : r3 'foo '; // added an accidental space after 'foo'
parser grammar P

options { tokenVocab=L; }

r1 : FOO r2;

r2 : r3 FOO;


lexer grammar L;

FOO : 'foo';

注意,您还可以导入语法,这是不同的:https://github.com/antlr/antlr4/blob/master/doc/grammars.md#grammar-imports

 类似资料:
  • 我有一个处理AND和OR表达式的antlr规则。看起来是这样的: 这将生成一个非常深的解析树。E、 g.如果你有 结果是这样的树: 这可能会变得非常深入和昂贵,所以我想添加一个优化。我想同时处理多个顺序AND表达式(类似于OR-s)。 所以我想这样做: 我认为这将为序列中的所有And-s生成一个节点。 然而,当我这样做的时候,antlr仍然选择生成递归树。我想那是因为规则是模棱两可的。有什么想法可

  • 我正在尝试从Cisco IOS配置解析以下命令:

  • 我希望第一个grammar1(输出正确的结果)产生与grammar2(错误的输出)相同的结果。这背后的原因是:唯一允许'-'作为第一个令牌的规则是#unaryexpr,所以由任何语法生成的解析器都会首先尝试匹配该规则。然后,如果解析器是贪婪的(对于两种语法中的任何一种),我希望它将“(5+9)+1000”作为一个整体,并将其与expr匹配,因为它是一个有效的expr。 我推理的错在哪里?

  • 您好,我需要一些关于使用antlr和java构建简单解析树的帮助。我曾尝试使用powershell编译和运行语法文件(即pascal.g4文件),我希望从中生成一些java文件,但有时我尝试使用命令“\antlr.bat-package pdl-o pdl。\pascal.g4”在powershell上收到一条消息,说明“系统找不到指定的文件”。 我想我输入的命令可能是错误的,但无论如何,我已经得

  • 基本上,我想结合这些g4文件: https://github.com/apache/groovy/tree/master/src/antlr 进入一个文件,我可以使用这个clojure库: https://github.com/aphyr/clj-antlr 它目前需要一个组合的解析器/词法器文件。如何破解这些文件,使它们以正确的语法存在于单个文件中?我已经排除了连接文件和删除lexer和para

  • 我已经尝试了整整一周使用antlr构建一个语法,允许我解析电子邮件消息。 我的目标不是将整个电子邮件彻底解析为令牌,而是将其分解为相关部分。 这是我必须处理的文档格式。描述不属于消息一部分的内联注释: 我面临的问题如下: 我没有想出一个好方法来跳过消息开头的文本,并在找到标记后才开始应用解析规则。截面类型1 捕获节开始和句子标记之间节内的所有文本 在SECTION\u结束标记之后,忽略后面的所有文