在 Antlr4 中解析 Decaf 语法
Parsing Decaf grammar in Antlr4
我正在为用 ANTLR4 编写的 Decaf 编程语言创建解析器和词法分析器规则。有一个解析器测试文件,我正在尝试 运行 通过在终端 window 上打印访问过的节点并将它们粘贴到 D3_parser_tree.html
class 来获取解析器树。根据此测试文件,当前解析器树缺少带有数字 10 的右方括号:class program { int i [10]; }
我得到的错误:mismatched input '10' expecting INT_LITERAL
尽管我已经为 INT_LITERAL
声明了词法分析器规则,然后根据给定的 Decaf 规范在 field_decl
内的解析器规则中调用它,但我不确定为什么会收到此错误:
** Parser rules **
<program> → class Program ‘{‘ <field_decl>* <method_decl>* ‘}’
<field_decl> → <type> { <id> | <id> ‘[‘ <int_literal> ‘]’ }+, ;
<method_decl> → { <type> | void } <id> ( [ { <type> <id> }+, ] ) <block>
<digit> → 0 | 1 | 2 | … | 9
<block> → ‘{‘ <var_decl>* <statement>* ‘}’
<literal> → <int_literal> | <char_literal> | <bool_literal>
<hex_digit> → <digit> | a | b | c | … | f | A | B | C | … | F
<int_literal> → <decimal_literal> | <hex_literal>
<decimal_literal> → <digit> <digit>*
<hex_literal> → 0x <hex_digit> <hex_digit>*
相关词法分析器规则:
NUMBER : [0-9]+;
fragment ALPHA : [_a-zA-Z0-9];
fragment DIGIT : [0-9];
fragment DECIMAL_LITERAL : DIGIT+;
CHAR_LITERAL : '\'' CHAR '\'';
STRING_LITERAL : '"' CHAR+ '"' ;
COMMENT : '//' ~('\n')* '\n' -> skip;
WS : (' ' | '\n' | '\t' | '\r') + -> skip;
相关解析器规则:
program : CLASS VAR LCURLYBRACE field_decl*method_decl* RCURLYBRACE EOF;
field_decl : data_type field ( COMMA field )* SEMICOLON;
如果您需要更多详细信息,请告诉我,非常感谢您的帮助。
以下规则冲突:
VAR : ALPHA+;
...
NUMBER : [0-9]+;
...
INT_LITERAL : DECIMAL_LITERAL | HEX_LITERAL;
它们都匹配 10
,但词法分析器将始终选择 VAR
,因为这是首先定义的规则。
这就是 ANTLR 的词法分析器的工作原理:它尝试匹配尽可能多的字符,当两个(或更多)规则都匹配相同数量的字符时,首先定义的那个 "wins"。
如果将 field
更改为:
,您将看到它解析正确
field : VAR | VAR LSQUAREBRACE VAR RSQUAREBRACE;
我正在为用 ANTLR4 编写的 Decaf 编程语言创建解析器和词法分析器规则。有一个解析器测试文件,我正在尝试 运行 通过在终端 window 上打印访问过的节点并将它们粘贴到 D3_parser_tree.html
class 来获取解析器树。根据此测试文件,当前解析器树缺少带有数字 10 的右方括号:class program { int i [10]; }
我得到的错误:mismatched input '10' expecting INT_LITERAL
尽管我已经为 INT_LITERAL
声明了词法分析器规则,然后根据给定的 Decaf 规范在 field_decl
内的解析器规则中调用它,但我不确定为什么会收到此错误:
** Parser rules **
<program> → class Program ‘{‘ <field_decl>* <method_decl>* ‘}’
<field_decl> → <type> { <id> | <id> ‘[‘ <int_literal> ‘]’ }+, ;
<method_decl> → { <type> | void } <id> ( [ { <type> <id> }+, ] ) <block>
<digit> → 0 | 1 | 2 | … | 9
<block> → ‘{‘ <var_decl>* <statement>* ‘}’
<literal> → <int_literal> | <char_literal> | <bool_literal>
<hex_digit> → <digit> | a | b | c | … | f | A | B | C | … | F
<int_literal> → <decimal_literal> | <hex_literal>
<decimal_literal> → <digit> <digit>*
<hex_literal> → 0x <hex_digit> <hex_digit>*
相关词法分析器规则:
NUMBER : [0-9]+;
fragment ALPHA : [_a-zA-Z0-9];
fragment DIGIT : [0-9];
fragment DECIMAL_LITERAL : DIGIT+;
CHAR_LITERAL : '\'' CHAR '\'';
STRING_LITERAL : '"' CHAR+ '"' ;
COMMENT : '//' ~('\n')* '\n' -> skip;
WS : (' ' | '\n' | '\t' | '\r') + -> skip;
相关解析器规则:
program : CLASS VAR LCURLYBRACE field_decl*method_decl* RCURLYBRACE EOF;
field_decl : data_type field ( COMMA field )* SEMICOLON;
如果您需要更多详细信息,请告诉我,非常感谢您的帮助。
以下规则冲突:
VAR : ALPHA+;
...
NUMBER : [0-9]+;
...
INT_LITERAL : DECIMAL_LITERAL | HEX_LITERAL;
它们都匹配 10
,但词法分析器将始终选择 VAR
,因为这是首先定义的规则。
这就是 ANTLR 的词法分析器的工作原理:它尝试匹配尽可能多的字符,当两个(或更多)规则都匹配相同数量的字符时,首先定义的那个 "wins"。
如果将 field
更改为:
field : VAR | VAR LSQUAREBRACE VAR RSQUAREBRACE;