Skip to content

Commit fa9a1b4

Browse files
committed
support prefix parsing of ! + add parsing test
1 parent e624a6b commit fa9a1b4

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

mlir/lib/Tools/PDLL/AST/NodePrinter.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,10 @@ void NodePrinter::printImpl(const AttributeExpr *expr) {
225225
void NodePrinter::printImpl(const CallExpr *expr) {
226226
os << "CallExpr " << expr << " Type<";
227227
print(expr->getType());
228-
os << ">\n";
228+
os << ">";
229+
if (expr->getIsNegated())
230+
os << " negated";
231+
os << "\n";
229232
printChildren(expr->getCallableExpr());
230233
printChildren("Arguments", expr->getArguments());
231234
}

mlir/lib/Tools/PDLL/Parser/Parser.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
#include "llvm/Support/ScopedPrinter.h"
3232
#include "llvm/TableGen/Error.h"
3333
#include "llvm/TableGen/Parser.h"
34-
#include <string>
3534
#include <optional>
35+
#include <string>
3636

3737
using namespace mlir;
3838
using namespace mlir::pdll;
@@ -324,6 +324,7 @@ class Parser {
324324
FailureOr<ast::Expr *> parseInlineConstraintLambdaExpr();
325325
FailureOr<ast::Expr *> parseInlineRewriteLambdaExpr();
326326
FailureOr<ast::Expr *> parseMemberAccessExpr(ast::Expr *parentExpr);
327+
FailureOr<ast::Expr *> parseNegatedExpr();
327328
FailureOr<ast::OpNameDecl *> parseOperationName(bool allowEmptyName = false);
328329
FailureOr<ast::OpNameDecl *> parseWrappedOperationName(bool allowEmptyName);
329330
FailureOr<ast::Expr *>
@@ -1830,6 +1831,9 @@ FailureOr<ast::Expr *> Parser::parseExpr() {
18301831
case Token::l_square:
18311832
lhsExpr = parseArrayAttrExpr();
18321833
break;
1834+
case Token::exclam:
1835+
lhsExpr = parseNegatedExpr();
1836+
break;
18331837
case Token::string_block:
18341838
return emitError("expected expression. If you are trying to create an "
18351839
"ArrayAttr, use a space between `[` and `{`.");
@@ -1845,11 +1849,11 @@ FailureOr<ast::Expr *> Parser::parseExpr() {
18451849
case Token::dot:
18461850
lhsExpr = parseMemberAccessExpr(*lhsExpr);
18471851
break;
1848-
case Token::exclam:
1849-
// TODO: Fx: This parses the "!" as suffix instead of prefix.
1850-
consumeToken(Token::exclam);
1851-
lhsExpr = parseCallExpr(*lhsExpr, /*isNegated = */ true);
1852-
break;
1852+
// case Token::exclam:
1853+
// // TODO: Fx: This parses the "!" as suffix instead of prefix.
1854+
// consumeToken(Token::exclam);
1855+
// lhsExpr = parseCallExpr(*lhsExpr, /*isNegated = */ true);
1856+
// break;
18531857
case Token::l_paren:
18541858
lhsExpr = parseCallExpr(*lhsExpr);
18551859
break;
@@ -2068,6 +2072,16 @@ FailureOr<ast::Expr *> Parser::parseMemberAccessExpr(ast::Expr *parentExpr) {
20682072
return createMemberAccessExpr(parentExpr, memberName, loc);
20692073
}
20702074

2075+
FailureOr<ast::Expr *> Parser::parseNegatedExpr() {
2076+
consumeToken(Token::exclam);
2077+
if (!curToken.is(Token::identifier))
2078+
return emitError("expected native constraint");
2079+
FailureOr<ast::Expr *> identifierExpr = parseIdentifierExpr();
2080+
if (failed(identifierExpr))
2081+
return failure();
2082+
return parseCallExpr(*identifierExpr, /*isNegated = */ true);
2083+
}
2084+
20712085
FailureOr<ast::OpNameDecl *> Parser::parseOperationName(bool allowEmptyName) {
20722086
SMRange loc = curToken.getLoc();
20732087

mlir/test/mlir-pdll/Parser/expr.pdll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,21 @@ Pattern {
7777

7878
// -----
7979

80+
// CHECK: Module {{.*}}
81+
// CHECK: -UserConstraintDecl {{.*}} Name<checkOp> ResultType<Tuple<>>
82+
// CHECK: `-PatternDecl {{.*}}
83+
// CHECK: -CallExpr {{.*}} Type<Tuple<>> negated
84+
// CHECK: `-DeclRefExpr {{.*}} Type<Constraint>
85+
// CHECK: `-UserConstraintDecl {{.*}} Name<checkOp> ResultType<Tuple<>>
86+
Constraint checkOp(op: Op);
87+
88+
Pattern {
89+
let inputOp = op<my_dialect.bar>;
90+
!checkOp(inputOp);
91+
erase inputOp;
92+
}
93+
// -----
94+
8095
//===----------------------------------------------------------------------===//
8196
// MemberAccessExpr
8297
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)