Написать грамматику Matlab из грамматики Python - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь написать грамматику Matlab и вдохновляюсь на грамматику Python.

Однако у меня есть несколько вопросов по этому поводу:

1.

b.rule(M_EXPR).is(FACTOR, b.zeroOrMore(b.firstOf("*", "//", "/", "%", "@"), FACTOR)).skipIfOneChild();//M for multiplicative operator
b.rule(A_EXPR).is(M_EXPR, b.zeroOrMore(b.firstOf("+", "-"), M_EXPR)).skipIfOneChild();//A for additive operator

b.rule(SHIFT_EXPR).is(A_EXPR, b.zeroOrMore(b.firstOf("<<", ">>"), A_EXPR)).skipIfOneChild();
b.rule(AND_EXPR).is(SHIFT_EXPR, b.zeroOrMore("&", SHIFT_EXPR)).skipIfOneChild();
b.rule(XOR_EXPR).is(AND_EXPR, b.zeroOrMore("^", AND_EXPR)).skipIfOneChild();
b.rule(OR_EXPR).is(XOR_EXPR, b.zeroOrMore("|", XOR_EXPR)).skipIfOneChild(); //bitwise operations : voir https://www.tutorialspoint.com/python/bitwise_operators_example.htm


b.rule(COMPARISON).is(OR_EXPR, b.zeroOrMore(COMP_OPERATOR, OR_EXPR)).skipIfOneChild();
b.rule(COMP_OPERATOR).is(b.firstOf(
  "<",
  ">",
  "==",
  ">=",
  "<=",
  "!=",
  "<>",
  b.sequence("is", b.optional("not")),
  b.sequence(b.optional("not"), "in"))); //is and is not compare object identities (true or false if the same object)

b.rule(OR_TEST).is(AND_TEST, b.zeroOrMore("or", AND_TEST)).skipIfOneChild();
b.rule(AND_TEST).is(NOT_TEST, b.zeroOrMore("and", NOT_TEST)).skipIfOneChild();
b.rule(NOT_TEST).is(b.firstOf(COMPARISON, b.sequence("not", NOT_TEST))).skipIfOneChild(); //boolean operations

Здесь вы можете видеть, что логические операции связаны с побитовыми операциями.Но побитовые операции в Matlab определяются как функции (https://fr.mathworks.com/help/matlab/bit-wise-operations.html). Есть ли у вас какие-либо идеи о том, что я мог бы сделать, чтобы использовать их в своем определении грамматики?

РЕДАКТИРОВАТЬ: Вот что я сделал для первого1. Я пока не знаю, сработает ли это.

    b.rule(M_EXPR).is(FACTOR, b.zeroOrMore(b.firstOf("*", "//", "/", "%", "@"), FACTOR)).skipIfOneChild();//M for multiplicative operator
    b.rule(A_EXPR).is(M_EXPR, b.zeroOrMore(b.firstOf("+", "-"), M_EXPR)).skipIfOneChild();//A for additive operator

    b.rule(COMPARISON).is(A_EXPR, b.zeroOrMore(COMP_OPERATOR, A_EXPR)).skipIfOneChild();
    b.rule(COMP_OPERATOR).is(b.firstOf(
            "<",
            ">",
            "==",
            ">=",
            "<=",
            "~="));

    b.rule(OR_TEST).is(AND_TEST, b.zeroOrMore(OR, AND_TEST)).skipIfOneChild();
    b.rule(AND_TEST).is(NOT_TEST, b.zeroOrMore(AND, NOT_TEST)).skipIfOneChild();
    b.rule(NOT_TEST).is(b.firstOf(COMPARISON, b.sequence(TILDE, NOT_TEST))).skipIfOneChild();  //boolean operations

Надеюсь, вы мне поможете:)

...