繁体   English   中英

在ANTLR中解析DECAF语法

Parsing DECAF grammar in ANTLR

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在使用Antlr语法DECAF创建DECAF的解析器;

//********* LEXER ******************
LETTER: ('a'..'z'|'A'..'Z') ;
DIGIT : '0'..'9' ;
ID : LETTER( LETTER | DIGIT)* ;
NUM: DIGIT(DIGIT)* ;
COMMENTS: '//' ~('\r' | '\n' )*  -> channel(HIDDEN);
WS : [ \t\r\n\f | ' '| '\r' | '\n' | '\t']+  ->channel(HIDDEN); 

CHAR: (LETTER|DIGIT|' '| '!' | '"' | '#' | '$' | '%' | '&' | '\'' | '(' | ')' | '*' | '+' 

| ',' | '-' | '.' | '/' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | '[' | '\\' | ']' | '^' | '_' | '`'| '{' | '|' | '}' | '~' 
'\t'| '\n' | '\"' | '\'');


// ********** PARSER *****************

program : 'class' 'Program' '{' (declaration)* '}'  ;

declaration: structDeclaration| varDeclaration | methodDeclaration  ;

varDeclaration: varType ID ';' | varType ID '[' NUM ']' ';'  ;

structDeclaration : 'struct' ID '{' (varDeclaration)* '}'  ;

varType: 'int' | 'char' | 'boolean' | 'struct' ID | structDeclaration | 'void'  ;

methodDeclaration : methodType ID '(' (parameter (',' parameter)*)* ')' block  ;

methodType : 'int' | 'char' | 'boolean' | 'void' ;

parameter : parameterType ID | parameterType ID '[' ']' ;

parameterType: 'int' | 'char' | 'boolean'  ;

block : '{' (varDeclaration)* (statement)* '}' ;

statement : 'if' '(' expression ')' block ( 'else' block )? 
           | 'while' '(' expression ')' block
           |'return' expressionA ';' 
           | methodCall ';' 
           | block  
           | location '=' expression 
           | (expression)? ';'  ;

expressionA: expression | ;


location : (ID|ID '[' expression ']') ('.' location)?  ;

expression : location | methodCall | literal | expression op expression | '-' expression | '!' expression | '('expression')'  ;

methodCall :    ID '(' arg1 ')' ;

arg1    :   arg2 | ;

arg2    :   (arg) (',' arg)* ;

arg :   expression;

op: arith_op | rel_op | eq_op | cond_op  ;

arith_op : '+' | '-' | '*' | '/' | '%' ;

rel_op : '<' | '>' | '<=' | '>=' ;

eq_op : '==' | '!=' ;

cond_op : '&&' | '||' ;

literal : int_literal | char_literal | bool_literal ;

int_literal : NUM ;

char_literal : '\'' CHAR '\'' ;

bool_literal : 'true' | 'false' ;

当我输入时:

    class Program {

    void main(){

        return 3+5 ;
    }
    }

解析树无法正确构建,因为它无法将3 + 5识别为表达式。 我的语法是否有引起问题的错误?

1 个回复

Lexer规则从上到下匹配。 当2个或更多lexer规则匹配相同数量的字符时,首先定义的一个将获胜 因此,一位整数将作为DIGIT而不是NUM匹配。

尝试解析以下内容:

class Program {
    void main(){    
        return 33 + 55 ;
    }
}

将被解析就好了。 这是因为3355 匹配为NUM ,因为NUM现在可以匹配2个字符( DIGIT仅1个字符,所以NUM wins )。

要修复此问题,请使DIGIT成为片段(以及LETTER ):

fragment LETTER: ('a'..'z'|'A'..'Z') ;
fragment DIGIT : '0'..'9' ;
ID : LETTER( LETTER | DIGIT)* ;
NUM: DIGIT(DIGIT)* ;

Lexer片段仅由其他lexer规则在内部使用,并且永远不会成为其自身的标记。

还有两件事:您的WS规则匹配得太多(现在也匹配了|' ),应该是:

WS : [ \t\r\n\f]+  ->channel(HIDDEN);

而且您不应该在解析器中匹配char文字:在lexer中进行匹配:

CHAR : '\'' ( ~['\r\n\\] | '\\' ['\\] ) '\'';

否则,将无法正确解析以下内容:

class Program {
    void main(){
        return '1';
    }
}

因为1将被标记为NUM而不是CHAR

1 在 Antlr4 中解析 Decaf 语法

我正在为用 ANTLR4 编写的 Decaf 编程语言创建解析器和词法分析器规则。 我正在尝试运行一个解析器测试文件,通过在终端窗口上打印访问过的节点并将它们粘贴到D3_parser_tree.html类中来获取解析器树。 根据此测试文件,当前解析器树缺少带有数字 10 的右方括号: class p ...

2 解析规则 Decaf 语法​​ antlr4

我正在为用 ANTLR4 编写的 Decaf 编程语言创建解析器和词法分析器规则。 我正在尝试解析测试文件并不断收到错误消息,语法中一定有问题,但我无法弄清楚。 我的测试文件如下所示: 错误是:第 2:8 行不匹配的输入 '10' 期望 INT_LITERAL 这是完整的 Decaf.g4 ...

3 ANTLR 4:语法分析

我想从AppleSoft Basic脚本中解析一些数据。 我选择ANTLR并下载此语法: jvmBasic 我试图提取不带参数的函数名称: 但它返回PRINT“ HELLO”,例如除行号以外的完整表达式这是我要解析的字符串: 10打印“您好!” ...

4 用于解析简单表达式的Antlr语法

我想用antlr4解析以下表达式 可以嵌套termpannear函数的位置 这是我的语法: 运行后: 树看起来像: 有人可以帮我这个语法吗? 因此,解析的树包含所有参数以及嵌套工作 注意:经我的建议改写为 我认为现在可以正常工作了,我得到了以 ...

5 使用antlr语法解析输入字符串

我的语法有以下问题: 我要解析的输入字符串如下: 我使用的语法: 当我通过antlr运行它时,我收到一个错误: 在输入中使用的任何单词,例如“ command”或“ args”,都会引起同样的问题。 有人知道如何处理这类问题吗? ...

6 ANTLR语法-解析标签和说明

我正在写一个使用指令列表代码的解释器。 尝试为带有标签的指令编写语法时遇到一些问题。 我想解析此代码块: 如您所见,这些标签在一行中没有指令,但是我要解析的语言允许一行中的“标签+指令”。 因此,指令和标签有三种不同的组合: 指令 标签: 标签:说明 ...

7 ANTLR语法用于解析文本文件

我正在疯狂地尝试使用ANTLR生成解析器语法。 我有像这样的纯文本文件: 每个“ Diagram”实体都包含在EOF之前的“ Diagram:”和“(TOT)之间。在同一纯文本文件中,可以存在多个” Diagram“实体。 我已经用ANTRL做过一些测试 我的目标是能够递 ...

8 antlr4无法根据语法进行解析

我正在尝试根据以下(部分)语法分析“ for循环”: 当我尝试生成如何解析的gui时,它并没有遵循我上面提供的语法。 它是这样产生的: 我以前遇到过此问题,然后我只是退出了cmd,再次将其打开并编译了所有内容,然后以某种方式工作了。 现在,它不起作用。 我对antl ...

9 Antlr4语法问题(不完全解析)

我是ANTLR的新手,正在尝试使此语法有效: 当我在输入中输入"Test"时,它正在工作并返回字符串"Test" 。 这是我在输入中输入"Test"时在IParseTree得到的IParseTree : “(开始(声明(表达式(主要(文字(字符串\\“测试\\”)))))) ...

10 在antlr4解析语法中使用文字?

我在看Java的Parser和Lexer语法,可以在这里找到。 Lexer语法定义了记号,例如分号和其他内容。 然后,在解析器语法中,文字';' 用于代替编写SEMI 。 在这里使用它的一个例子。 这是为什么? 这背后有什么原因吗? ...

2019-06-10 10:44:30 1 15   antlr4
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM