【问题标题】:Antlr4 Grammar/Rules - issue with solving BASIC print variableAntlr4 语法/规则 - 解决 BASIC 打印变量的问题
【发布时间】:2013-12-12 04:15:12
【问题描述】:

场景是我想使用 ANTRL4 创建一种 BASIC(高级)语言。

下面的测试输入是创建一个名为 C$ 的变量并分配一个整数值。赋值有效。 print 语句可以工作,除非将变量连接到它:-

     ************ TEST CASE ****************

$C=15;

打印“危险!”; # 打印作品

打印“剩余GB数=”+ $C;

使用 Parse Tree Inspector 我可以看到分配工作正常,但是当它识别字符串中的变量时,似乎有一个不匹配的输入 '+' 期望 STMTEND。

我想知道是否有人可以在这里帮助我,看看我需要对我的规则和语法进行哪些调整来解决这个问题。

非常感谢。

凯文 PS。作为一个附带问题,我宁愿拥有 C$ 而不是 $C 但早期......

********RULES************


VARNAME : '$'('A'..'Z')* 
        ;

CONCAT  : '+'
        ;
STMTEND : SEMICOLON NEWLINE* | NEWLINE+
        ;
STRING  : SQUOTED_STRING (CONCAT SQUOTED_STRING | CONCAT VARNAME)*
    | DQUOTED_STRING (CONCAT DQUOTED_STRING | CONCAT VARNAME)*
        ; 
fragment SQUOTED_STRING : '\'' (~['])* '\''
    ;

fragment DQUOTED_STRING  
    :  '"' ( ESC_SEQ| ~('\\'|'"') )* '"'  
    ;  

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 HEX_DIGIT : '0x' ('0'..'9' | 'a'..'f' | 'A'..'F')+
    ;

fragment UNICODE_ESC :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT  
    ;  

SEMICOLON : ';' 
    ;

NEWLINE : '\r'?'\n' 


************GRAMMAR************

print_command
    :   PRINT STRING STMTEND #printCommandLabel
    ;

assignment
    : VARNAME EQUALS INTEGER STMTEND #assignInteger 
    | VARNAME EQUALS STRING STMTEND #assignString
    ;

【问题讨论】:

    标签: antlr4 basic


    【解决方案1】:

    您不应该尝试在您的词法分析器中创建连接表达式:这是解析器的职责。应该这样做:

    print_command
     :   PRINT STRING STMTEND #printCommandLabel
     ;
    
    assignment
     : VARNAME EQUALS expression STMTEND
     ;
    
    expression
     : expression CONCAT expression
     | INTEGER
     | STRING
     | VARNAME
     ;
    
    CONCAT
     : '+'
     ;
    
    VARNAME 
     : '$'('A'..'Z')* 
     ;
    
    STMTEND 
     : SEMICOLON NEWLINE* 
     | NEWLINE+
     ;
    
    STRING
     : SQUOTED_STRING
     | DQUOTED_STRING
     ; 
    
    fragment SQUOTED_STRING
     : '\'' (~['])* '\''
     ;
    
    fragment DQUOTED_STRING  
     : '"' ( ESC_SEQ| ~('\\'|'"') )* '"'  
     ;  
    
    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 HEX_DIGIT : '0x' ('0'..'9' | 'a'..'f' | 'A'..'F')+;
    
    fragment UNICODE_ESC :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT;  
    
    fragment SEMICOLON : ';';
    
    fragment NEWLINE : '\r'?'\n';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多