2

私はANTLRでの最初の冒険をほぼ終えました、そしてそれはかなりの旅行でした。残念ながら、常に蹄鉄、手榴弾、核兵器しか数えられませんよね?

とにかく、私は次のような入力を解析しようとしています:

; IF AGE IS LESS THAN 21, STILL RETURN TRUE FOR OVERSEAS LOCATION \r\n
SHOW "AGE REQUIREMENTS FAILED" FOR \r\n
IF AGE < 21 THEN \r\n
LOCATION = "OVERSEAS" \r\n
ENDIF \r\n
\r\n
; NEED  SOMEONE WHO HAS WORKED FOR US FOR > 1 YEAR EXCEPT FOR CEO \r\n
SHOW "MINIMUM TIME REQUIREMENT NOT MET" FOR \r\n
IF STARTDATE > TODAY - 1 YEAR THEN \r\n
EMPLID=001 \r\n
ENDIF \r\n

通常、テストが失敗すると、メッセージが表示されます。

とにかく、セットには1つ以上のSHOWルールを含めることができます。単一のSHOWルールの処理は機能しますが、入力ストリームに1つを超えるSHOWルールが含まれている場合は「分割」されません。

文法の関連するルールは次のとおりです。

showGroup returns [List<PolicyEvaluation> value]
  @init {List<PolicyEvaluation> peList = new ArrayList<PolicyEvaluation>();}
  : (expr1=show)* {peList.add($expr1.value);}
  {
    System.out.println("Entered policyGroup rule");
    $value = peList;
  }
  ;

// evaluate a single SHOW statement
show returns [PolicyEvaluation value]
  : ('SHOW' expr1=STRING 'FOR')? expr2=ifStatement EOL*
  {
    System.out.println("Entered show rule");
    Boolean expr2Value = (Boolean) $expr2.value;
    PolicyEvaluation pe = new PolicyEvaluation();
    if (expr1 == null) {
      pe.setValue(expr2Value);
      pe.setMessage(null);
    } else {
        if (expr2Value == false) {
          pe.setValue(false);
          pe.setMessage(expr1.getText());
        } else {
          pe.setValue(true);
          pe.setMessage(null);
        }   
    }
    $value = pe;
  }
  ;
// rules leading up to the show rule
// domain-specific grammar rules
STRING: '"' ID  (' ' ID)* '"'
  {
    System.out.println("Entered STRING lexer rule");
    // strip the quotes once we match this token
    setText(getText().substring(1, getText().length()-1));
  }
  ;
COMMENT: ';' (ID|' ')* EOL {$channel = HIDDEN;};
EOL: ('\r'|'\n'|'\r\n') {$channel = HIDDEN;};
SPACE: ' ' {$channel = HIDDEN;};

多分これは単純なことです。どんな助けでも大歓迎です。

ジェイソン

4

1 に答える 1

3

これを変更してみてください:(expr1=show)* {peList.add($expr1.value);}

これに:(expr1=show {peList.add($expr1.value);})*

そのままのアクションは、すべてのshow試合が完了した後にのみ発動し、最後の試合を操作できるようになりますexpr1

于 2012-11-27T17:26:48.157 に答える