用antlrworks求解左递归

用antlrworks求解左递归,antlr,grammar,antlrworks,Antlr,Grammar,Antlrworks,您好,我想编写一个语法(使用ANTLRWORKS),稍后(在调试模式下)接受此代码 repeat_until :'repeat' seq_statement 'until' exp ; read : 'read' ID ';' ; fragment Operation_stat : (NUMBER|ID) OP (NUMBER|ID) ; OP : ('+'|'-'|'*'|'/')

您好,我想编写一个语法(使用ANTLRWORKS),稍后(在调试模式下)接受此代码

repeat_until
    :'repeat' seq_statement 'until' exp
    ;

read    :

          'read' ID ';'  
    ;

    fragment    
Operation_stat
    :   (NUMBER|ID) OP (NUMBER|ID) 
    ;

OP  :   ('+'|'-'|'*'|'/')
    ;

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

LOG_OP  :
('<' | '>' | '=' | '<=' | '>=' )
    ;


ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;



FLOAT
    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
    |   '.' ('0'..'9')+ EXPONENT?
    |   ('0'..'9')+ EXPONENT
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

STRING
    :  '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\''
    ;




fragment
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;
重复\u直到
:“重复”seq_语句“直到”exp
;
阅读:
'读'ID';'
;
碎片
统计行动
:(编号| ID)OP(编号| ID)
;
OP:(“+”|“-“|”*“|”/”)
;
编号:
'0'..'9'+   
;
日志操作:
('' | '=' | '=' )
;
ID:('a'、'z'|'a'、'z'|'a'('a'、'z'|'a'、'z'|'0'、'9'|'a')*
;
浮动
:('0'..'9')+'。('0'..'9')*指数?
|“.”('0'..'9')+指数?
|('0'..'9')+指数
;
评论
:“/”~(“\n”|“\r')*“\r”?”\n'{$channel=HIDDEN;}
|“/*”(选项{greedy=false;}:)*“*/'{$channel=HIDDEN;}
;
WS:(“”
|“\t”
|“\r”
|“\n”
){$channel=HIDDEN;}
;
一串
:“\'”(ESC| ~(“\\'\'\''\''\'')*“\”
;
片段
指数:('e'|'e')('+'|'-')?('0'..'9')+ ;
片段
十六进制数字:('0'..'9'|'a'..'f'|'a'..'f');
片段
电子稳定控制系统
:“\\”(“b”“t”“n”“f”“r”“r”“\\”)“\”\”\“\”\”)
|UNICODE_ESC
|八进制
;
片段
八进制
:   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
|   '\\' ('0'..'7') ('0'..'7')
|   '\\' ('0'..'7')
;
片段
UNICODE_ESC
:“\\”“u”十六进制数字十六进制数字十六进制数字十六进制数字十六进制数字
;

Thanx感谢您的帮助

我相信AnlWorks有一个功能可以帮助从语法中删除左递归,尽管在我的记忆中,它只适用于非常基本的语法。我上次使用它已经有一段时间了,所以您必须在这方面进行调查

要手动删除左递归,请参阅:(确保完成所有3个部分)

编辑 我不确定我是否能帮助您:您似乎完全忽略了一点,即ANTLR无法处理左递归语法。您的以下解析器规则:

seq_statement 
  :  seq_statement ';' statement 
  |  seq_statement
  ;

simple_exp
  :  simple_exp OP term 
  |  term    
  ;

term    
  :  term OP factor factor 
  |  factor  
  ;
都是如此明显的左递归,以至于我不知道如何更清楚地解释。我的意思是,你难道看不出这样的规则有什么不对吗:

a
  : a b
  ;
?这与您的
seq_语句
规则基本相同

我得到的印象是你试图将一些现有的语法转换成ANTLR语法。是这样吗?你真的知道左递归的真正含义吗

编辑二 比如:

parse
  :  block EOF 
  ;

block
  :  statement (';' statement)* ';'? 
  ;

statement
  :  'read' expression  
  |  'write' expression 
  |  ifStatement
  |  repeatStatement
  |  assignment
  ;

ifStatement
  :  'if' expression 'then' block? ('else' block?)? 'end' 
  ;

repeatStatement
  :  'repeat' block? 'until' expression 
  ;

assignment
  :  Identifier ':=' expression 
  ;

expression
  :  equalityExp
  ;

equalityExp
  :  relationalExp (('=' | '!=') relationalExp)*
  ;

relationalExp
  :  additiveExp (('>=' | '<=' | '>' | '<') additiveExp)*
  ;

additiveExp
  :  multiplicativeExp (('+' | '-') multiplicativeExp)*
  ;

multiplicativeExp
  :  atom (('*' | '/' | '%') atom)*
  ;

atom
  :  Identifier
  |  Int
  |  '(' expression ')' 
  ;

Int
  :  '0'..'9'+
  ;

Identifier
  :  'a'..'z'+
  ;

Space
  :  (' ' | '\t' | '\r' | '\n') {skip();}
  ;
parse
:块EOF
;
块
:语句(“;”语句)*“;”?
;
陈述
:“read”表达式
|“写”表达式
|国际单项体育联合会声明
|重复声明
|分配
;
国际单项体育联合会声明
:'if'expression'然后'block?('else'block?)'end'
;
重复声明
:“重复”block“直到”表达式
;
分配
:标识符“:=”表达式
;
表达
:equalityExp
;
等式exp
:relationalExp((“=”|“!=”)relationalExp)*
;
关系实验

:additiveExp((“>=”|““|””)…谢谢你的回答我真的很努力地解决这个问题,但我是antlr的新手…希望你或其他人能指导我,你完全改变了问题…我把你的旧问题回复了过来,因为你现在把它改成的这个新问题已发布在这里: