Antlr4语法/规则-解决基本打印变量的问题

Antlr4语法/规则-解决基本打印变量的问题,antlr4,basic,Antlr4,Basic,场景是我想使用ANTRL4创建一种基本(高级)语言 下面的测试输入是创建一个名为C$的变量并分配一个整数值。值赋值是有效的。print语句可以工作,除非将变量连接到它:- ************ TEST CASE **************** $C=15 打印“危险的愤怒!”印刷品 打印“剩余GB数=”+$C 使用解析树检查器,我可以看到赋值工作正常,但当它识别字符串中的变量时,似乎存在不匹配的输入“+” 我想知道是否有人能在这里帮助我,看看我需要对我的规则和语法做什么调整

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

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

     ************ TEST CASE ****************
$C=15

打印“危险的愤怒!”印刷品

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

使用解析树检查器,我可以看到赋值工作正常,但当它识别字符串中的变量时,似乎存在不匹配的输入“+”

我想知道是否有人能在这里帮助我,看看我需要对我的规则和语法做什么调整来解决这个问题

非常感谢

凯文 另外,作为一个次要问题,我宁愿要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
    ;

您不应该尝试在lexer中创建concat表达式:这是解析器的责任。像这样的东西应该可以做到:

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';

您不应该尝试在lexer中创建concat表达式:这是解析器的责任。像这样的东西应该可以做到:

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';