gpt4 book ai didi

antlr - 左递归ANTLR文法

转载 作者:行者123 更新时间:2023-12-01 03:58:53 26 4
gpt4 key购买 nike

我写了一个语法但得到一个左递归错误。

grammar Lang;

options
{
output = AST;
language = C;
ASTLabelType= pANTLR3_BASE_TREE;
backtrack = true;
}

start : primary_expression+
;

primary_expression
: '{' expression '}'
| expression ',' expression
;

expression
: logical_or_expression
| logical_or_expression '?' expression ':' expression
| logical_or_expression '?' ':' expression
| logical_or_expression '?' expression
;

logical_or_expression
: logical_and_expression
| logical_and_expression '|' logical_or_expression
;

logical_and_expression
: primary_expression
| primary_expression '&' logical_and_expression
;

我收到以下错误:

[12:41:35] error(210): The following sets of rules are mutually left-recursive [primary_expression, logical_and_expression, logical_or_expression, expression]
[12:41:35] Aborting because the following rules are mutually left-recursive: [[Lang.primary_expression,index=2,line=19], [Lang.logical_and_expression,index=5,line=36], [Lang.logical_or_expression,index=4,line=31], [Lang.expression,index=3,line=24]]



更正语法
grammar Lang;
options
{
// Note that in the C implementation, all implementations of trees and
// adaptors pass around pANTLR3_BASE_TREE, which contains a super pointer
// to your own implementation of a tree node and tree and so on. Hence
// the node type is ALWAYS pANTLR3_BASE_TREE and there is no need to define
// the type (the definition is silently ignored if you leave it there)
//
//output = AST;
language = C;
//ASTLabelType= pANTLR3_BASE_TREE;
backtrack = true;
}

start : primary_expression+
;

primary_expression
: '{' expression '}'
| expression ',' expression
;

expression
: logical_or_expression
| logical_or_expression '?' expression ':' expression
| logical_or_expression '?' ':' expression
| logical_or_expression '?' expression
;

logical_or_expression
: logical_and_expression
| logical_and_expression '|' logical_or_expression
;

logical_and_expression
: STRING
| STRING '&' logical_and_expression
;

/* We're going to ignore all white space characters */
WS
: (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;}
;

STRING
: ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')+
;

最佳答案

Antlr 4 可以处理直接左递归,但不能处理间接左递归。在第一种情况下,“primary_expression”和“logical_and_expression:primary_expression ...”形成了间接左递归。但是现在antlr4不能生成'c'代码。

grammar test3;

options
{
language = Java;
}

start :
expression+
;

expression :
primary_expression
| expression '&' expression
| expression '|' expression
| expression '?' expression ':' expression
| expression '?' expression
| expression '?' ':' expression
| expression ',' expression
| '{' expression '}'
;

primary_expression : // variable or constant definition, such as
VARIABLE
| NUMBER
;
VARIABLE :
('A'..'Z')+
;

NUMBER :
('0'..'9') +
;

关于antlr - 左递归ANTLR文法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15018980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com