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

时间:2013-12-11 16:21:21

标签: antlr4 basic

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

下面的测试输入是创建一个名为C $的变量并指定一个整数值。值赋值有效。除了将变量连接到它之外,print语句有效: -

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

$ C = 15;

print" dangerdanger!&#34 ;; #print works

打印"剩余GB数=" + $ C;

Parse Tree Inspector

使用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
    ;

1 个答案:

答案 0 :(得分:1)

你不应该尝试在词法分析器中创建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';