1

我是 ANTLR 世界的新手,所以我希望有人可以进行代码审查,看看我正在尝试做的事情是否以最有效的方式完成。我要做的是解析本质上是一个(多)条件语句,它将被转换为 Lambda 语句:

例子:

Student Object
{
   string ID { get; set;}
   string Campus { get; set;}
   string FirstName { get; set;}
}

Evaluation Statements:
StudentID="XXX"
StudentID="XXX" || FirstName=="John"
(StudentID="XXX" || FirstName=="John")
(StudentID="XXX" || FirstName=="John") || (StudentID="YYY" || FirstName=="DOE")

以下是我到目前为止创建的代码。有人可以让我知道我是否朝着正确的方向前进:

/*lexer */grammar Test;


options {   
  output=AST;
}

tokens {

}

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/
  expr  :   multiExpression ((AND^|OR^) multiExpression)* EOF! ;

  multiExpression 
    :   primaryExpression ((AND^|OR^) primaryExpression)* |
            LPAREN! primaryExpression ((AND^|OR^) primaryExpression)* RPAREN!;

  primaryExpression 
    :   ID (EQUALS^ | GTR^ | LTN^ | GTREQ^ | LSTEQ^ | NOT^) value |
        LPAREN! ID (EQUALS^ | GTR^ | LTN^ | GTREQ^ | LSTEQ^ | NOT^) value RPAREN! ;

   value:  STRING
      |ID
      |INT
      |FLOAT
      |CHAR;




 //expr    : term ( ( PLUS | MINUS )  term )* ;

 //term    : factor ( ( MULT | DIV ) factor )* ;

 //factor  : NUMBER ;

 /*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

EQUALS  : '==';
GTR     : '>';
LTN     : '<';  
GTREQ   : '>=';
LSTEQ   : '<=';
NOT     : '!=';
OR      : '||';
LPAREN  : '(';
RPAREN  : ')';
AND     : '&&';
ID      : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
INT     : ('0'..'9')+;
FLOAT
    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
    |   '.' ('0'..'9')+ EXPONENT?
    |   ('0'..'9')+ EXPONENT
    ;

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

CHAR:  '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
    ;

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

0 回答 0