Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>When looking at the BNF rules of an <code>if</code> statement:</p> <pre><code>ifthenelse ::= 'if' expr 'then' newline statement_list else_clause? 'endif' else_clause ::= 'else' newline statement_list | 'elseif' expr 'then' newline statement_list else_clause? </code></pre> <p>your translation:</p> <pre><code>if_statement : KEYWORD_IF expression KEYWORD_THEN statement_list else_clause? KEYWORD_ENDIF ; else_clause : KEYWORD_ELSEIF ((OPENPARENTHESIS expression CLOSEPARENTHESIS) | expression) KEYWORD_THEN statement_list | KEYWORD_ELSE ((OPENPARENTHESIS statement_list CLOSEPARENTHESIS) | statement_list) else_clause? ; </code></pre> <p>is incorrect (you have an optional <code>else_clause</code> in the <code>KEYWORD_ELSE</code> alternative).</p> <p>It should be:</p> <pre><code>if_statement : KEYWORD_IF expression KEYWORD_THEN statement_list else_clause? KEYWORD_ENDIF ; else_clause : KEYWORD_ELSE statement_list | KEYWORD_ELSEIF expression KEYWORD_THEN statement_list else_clause? ; </code></pre> <p>And not that you don't need <code>((OPENPARENTHESIS expression CLOSEPARENTHESIS) | expression)</code> since a <code>expression</code> already matches <code>'(' expression ')'</code>.</p> <p>But the observations above are not the cause of your problem(s). The real issue is that your grammar does not account for unary expressions. It does not match the <code>-1</code> in the expression <code>si__DroneSystem___data_V[this]!=-1</code>. </p> <p>Change your <code>expression</code> rule into this:</p> <pre><code>expression : OPENPARENTHESIS expression CLOSEPARENTHESIS | OPENBRACKET expression CLOSEBRACKET | func_call | array_ref | function_reference | const_statement | identifier | '+' expression | '-' expression | 'not' expression | expression ('*'|'/') expression | expression ('+'|'-') expression | expression ('&gt;'|'&lt;'|'=='|'!='|'&gt;='|'&lt;=') expression | expression ('and'|'or') expression | identifier ; </code></pre> <p>Now input like this:</p> <pre><code>if this==null then return elseif(si__DroneSystem___data_V[this]!=-1)then return endif </code></pre> <p>will be parsed as follows:</p> <p><img src="https://i.stack.imgur.com/KW7nC.png" alt="enter image description here"></p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload