2013-12-11 36 views
1

该场景是我想用ANTRL4创建BASIC(高级)语言。Antlr4语法/规则 - 解决BASIC打印变量的问题

下面的测试输入是创建一个名为C $的变量并分配一个整数值。值的分配工作。打印语句的工作,除非该变量串联到它: -

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

$ C = 15;

print“dangerdanger!”; #print works

print“剩余的GB数量=”+ $ C;

Parse Tree Inspector

使用解析树督察我可以看到分配是工作正常,但是当它到达字符串中的变量的标识,似乎有一个不匹配的输入“+”期待STMTEND。

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

非常感谢提前。

Kevin 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

你不应该尝试创建自己的词法分析器内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'; 
+0

太棒了!非常感谢你做的这些。 – KevinY