Using ANTLR4 to create functions with no argument












-1














I am still new to ANTLR4 and I am trying to achieve the following



I have business rules which consist of logical operation
(A= 'text' or B < 1) and getDataDB



the function getDataDB does not take any argument. the function will retrieve some data to validate it and return either true or false.



my grammar is below



   /*
* Test grammar
*/

grammar FunctionRule;

parse: expr EOF
;


expr
: expr binop expr #logicalExpression
| lhs=VARIABLE compop rhs=VARIABLE #variableExpression
| lhs=VARIABLE compop rhs=STRING #stringExpression
| lhs=VARIABLE compop rhs=NUMBER #numberExpression
| TRUE #booleanTrue
| FALSE #booleanFalse
| function #functionExpression
| VARIABLE #booleanVariable
| LEFTPAREN expr RIGHTPAREN #enclosedExpression
;

binop : AND | OR
;

compop: EQUAL | LT | GT | LTE | GTE | NE
;

function : ID {System.out.println("HELLLL");};



TRUE: 'true' | 'TRUE' ;
FALSE: 'false' | 'FALSE';
STRING: '"' ~([tnr]| '"')* '"'
;
ID : [getDataDB];
LEFTPAREN: '(';
RIGHTPAREN: ')';
EQUAL : '=' | 'EQ';
LT : '<' | 'LT';
GT : '>' | 'GT';
LTE : '<=' | 'LE';
GTE : '>=' | 'GE';
NE : '!=' | 'NE';
AND : 'AND' | '&' | 'and';
OR : 'OR' | 'or' | '|';
VARIABLE : [a-zA-Z]+[a-zA-Z0-9_.-]*;
NUMBER : [0-9]+ ('.'[0-9]+)?;
SPACE : [ trn] -> skip;


When I generate classes from the grammar, i did not see anything related to the function.



1-how do I define a function correctly in the grammar file.



2- where i can put the code for this function after creating the classes, is it only in the action clause, is there is a way to put the class name in the grammar where i can put the implementation



Thanks for the help!










share|improve this question





























    -1














    I am still new to ANTLR4 and I am trying to achieve the following



    I have business rules which consist of logical operation
    (A= 'text' or B < 1) and getDataDB



    the function getDataDB does not take any argument. the function will retrieve some data to validate it and return either true or false.



    my grammar is below



       /*
    * Test grammar
    */

    grammar FunctionRule;

    parse: expr EOF
    ;


    expr
    : expr binop expr #logicalExpression
    | lhs=VARIABLE compop rhs=VARIABLE #variableExpression
    | lhs=VARIABLE compop rhs=STRING #stringExpression
    | lhs=VARIABLE compop rhs=NUMBER #numberExpression
    | TRUE #booleanTrue
    | FALSE #booleanFalse
    | function #functionExpression
    | VARIABLE #booleanVariable
    | LEFTPAREN expr RIGHTPAREN #enclosedExpression
    ;

    binop : AND | OR
    ;

    compop: EQUAL | LT | GT | LTE | GTE | NE
    ;

    function : ID {System.out.println("HELLLL");};



    TRUE: 'true' | 'TRUE' ;
    FALSE: 'false' | 'FALSE';
    STRING: '"' ~([tnr]| '"')* '"'
    ;
    ID : [getDataDB];
    LEFTPAREN: '(';
    RIGHTPAREN: ')';
    EQUAL : '=' | 'EQ';
    LT : '<' | 'LT';
    GT : '>' | 'GT';
    LTE : '<=' | 'LE';
    GTE : '>=' | 'GE';
    NE : '!=' | 'NE';
    AND : 'AND' | '&' | 'and';
    OR : 'OR' | 'or' | '|';
    VARIABLE : [a-zA-Z]+[a-zA-Z0-9_.-]*;
    NUMBER : [0-9]+ ('.'[0-9]+)?;
    SPACE : [ trn] -> skip;


    When I generate classes from the grammar, i did not see anything related to the function.



    1-how do I define a function correctly in the grammar file.



    2- where i can put the code for this function after creating the classes, is it only in the action clause, is there is a way to put the class name in the grammar where i can put the implementation



    Thanks for the help!










    share|improve this question



























      -1












      -1








      -1







      I am still new to ANTLR4 and I am trying to achieve the following



      I have business rules which consist of logical operation
      (A= 'text' or B < 1) and getDataDB



      the function getDataDB does not take any argument. the function will retrieve some data to validate it and return either true or false.



      my grammar is below



         /*
      * Test grammar
      */

      grammar FunctionRule;

      parse: expr EOF
      ;


      expr
      : expr binop expr #logicalExpression
      | lhs=VARIABLE compop rhs=VARIABLE #variableExpression
      | lhs=VARIABLE compop rhs=STRING #stringExpression
      | lhs=VARIABLE compop rhs=NUMBER #numberExpression
      | TRUE #booleanTrue
      | FALSE #booleanFalse
      | function #functionExpression
      | VARIABLE #booleanVariable
      | LEFTPAREN expr RIGHTPAREN #enclosedExpression
      ;

      binop : AND | OR
      ;

      compop: EQUAL | LT | GT | LTE | GTE | NE
      ;

      function : ID {System.out.println("HELLLL");};



      TRUE: 'true' | 'TRUE' ;
      FALSE: 'false' | 'FALSE';
      STRING: '"' ~([tnr]| '"')* '"'
      ;
      ID : [getDataDB];
      LEFTPAREN: '(';
      RIGHTPAREN: ')';
      EQUAL : '=' | 'EQ';
      LT : '<' | 'LT';
      GT : '>' | 'GT';
      LTE : '<=' | 'LE';
      GTE : '>=' | 'GE';
      NE : '!=' | 'NE';
      AND : 'AND' | '&' | 'and';
      OR : 'OR' | 'or' | '|';
      VARIABLE : [a-zA-Z]+[a-zA-Z0-9_.-]*;
      NUMBER : [0-9]+ ('.'[0-9]+)?;
      SPACE : [ trn] -> skip;


      When I generate classes from the grammar, i did not see anything related to the function.



      1-how do I define a function correctly in the grammar file.



      2- where i can put the code for this function after creating the classes, is it only in the action clause, is there is a way to put the class name in the grammar where i can put the implementation



      Thanks for the help!










      share|improve this question















      I am still new to ANTLR4 and I am trying to achieve the following



      I have business rules which consist of logical operation
      (A= 'text' or B < 1) and getDataDB



      the function getDataDB does not take any argument. the function will retrieve some data to validate it and return either true or false.



      my grammar is below



         /*
      * Test grammar
      */

      grammar FunctionRule;

      parse: expr EOF
      ;


      expr
      : expr binop expr #logicalExpression
      | lhs=VARIABLE compop rhs=VARIABLE #variableExpression
      | lhs=VARIABLE compop rhs=STRING #stringExpression
      | lhs=VARIABLE compop rhs=NUMBER #numberExpression
      | TRUE #booleanTrue
      | FALSE #booleanFalse
      | function #functionExpression
      | VARIABLE #booleanVariable
      | LEFTPAREN expr RIGHTPAREN #enclosedExpression
      ;

      binop : AND | OR
      ;

      compop: EQUAL | LT | GT | LTE | GTE | NE
      ;

      function : ID {System.out.println("HELLLL");};



      TRUE: 'true' | 'TRUE' ;
      FALSE: 'false' | 'FALSE';
      STRING: '"' ~([tnr]| '"')* '"'
      ;
      ID : [getDataDB];
      LEFTPAREN: '(';
      RIGHTPAREN: ')';
      EQUAL : '=' | 'EQ';
      LT : '<' | 'LT';
      GT : '>' | 'GT';
      LTE : '<=' | 'LE';
      GTE : '>=' | 'GE';
      NE : '!=' | 'NE';
      AND : 'AND' | '&' | 'and';
      OR : 'OR' | 'or' | '|';
      VARIABLE : [a-zA-Z]+[a-zA-Z0-9_.-]*;
      NUMBER : [0-9]+ ('.'[0-9]+)?;
      SPACE : [ trn] -> skip;


      When I generate classes from the grammar, i did not see anything related to the function.



      1-how do I define a function correctly in the grammar file.



      2- where i can put the code for this function after creating the classes, is it only in the action clause, is there is a way to put the class name in the grammar where i can put the implementation



      Thanks for the help!







      function parsing antlr4 business-rules






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 11 at 20:27









      Jost

      5,16262958




      5,16262958










      asked Nov 11 at 20:24









      OceanWavez

      4716




      4716
























          1 Answer
          1






          active

          oldest

          votes


















          0















          ID : [getDataDB];



          This means that ID matches a single letter that could be either one of g, e, t, D, a or B. What you likely wanted is ID: 'getDataDB'; which matches the string getDataDB. Note that calling this ID is highly misleading.




          where i can put the code for this function




          Are you writing an interpreter using a visitor? Then you'd put the code into the visitFunction method or rather in a getDataDB method that you call from visitFunction if the function name was equal to getDataDB (right now that would always be the case, but I'm assuming you eventually want to introduce more than one function).



          Alternatively you could also structure your grammar slightly differently like this (removing the ID rule):



          function : 'getDataDB' # GetDataDB
          | 'otherFunction' # OtherFunction
          ;


          Then you could define the functions in visitGetDataDB and visitOtherFunction respectively.



          All that's assuming that you want function names to be keywords (which implies that there can't be user-definable functions). If you don't, you should not have separate tokens for function names, so zero-argument functions and variables become indistinguishable syntactically (unless you add a requirement to add () for functions, but it doesn't look like that's what you want). So you should just have one rule that could be either a variable or a zero-argument function and then check whether the given identifier is the name of a function in visitVariableOrNullaryFunction (which maybe you'd just call visitVariable for brevity).






          share|improve this answer





















          • Dear sepp2K, thanks for the answer, I managed to add my function implementation.
            – OceanWavez
            Nov 13 at 1:21











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53252897%2fusing-antlr4-to-create-functions-with-no-argument%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0















          ID : [getDataDB];



          This means that ID matches a single letter that could be either one of g, e, t, D, a or B. What you likely wanted is ID: 'getDataDB'; which matches the string getDataDB. Note that calling this ID is highly misleading.




          where i can put the code for this function




          Are you writing an interpreter using a visitor? Then you'd put the code into the visitFunction method or rather in a getDataDB method that you call from visitFunction if the function name was equal to getDataDB (right now that would always be the case, but I'm assuming you eventually want to introduce more than one function).



          Alternatively you could also structure your grammar slightly differently like this (removing the ID rule):



          function : 'getDataDB' # GetDataDB
          | 'otherFunction' # OtherFunction
          ;


          Then you could define the functions in visitGetDataDB and visitOtherFunction respectively.



          All that's assuming that you want function names to be keywords (which implies that there can't be user-definable functions). If you don't, you should not have separate tokens for function names, so zero-argument functions and variables become indistinguishable syntactically (unless you add a requirement to add () for functions, but it doesn't look like that's what you want). So you should just have one rule that could be either a variable or a zero-argument function and then check whether the given identifier is the name of a function in visitVariableOrNullaryFunction (which maybe you'd just call visitVariable for brevity).






          share|improve this answer





















          • Dear sepp2K, thanks for the answer, I managed to add my function implementation.
            – OceanWavez
            Nov 13 at 1:21
















          0















          ID : [getDataDB];



          This means that ID matches a single letter that could be either one of g, e, t, D, a or B. What you likely wanted is ID: 'getDataDB'; which matches the string getDataDB. Note that calling this ID is highly misleading.




          where i can put the code for this function




          Are you writing an interpreter using a visitor? Then you'd put the code into the visitFunction method or rather in a getDataDB method that you call from visitFunction if the function name was equal to getDataDB (right now that would always be the case, but I'm assuming you eventually want to introduce more than one function).



          Alternatively you could also structure your grammar slightly differently like this (removing the ID rule):



          function : 'getDataDB' # GetDataDB
          | 'otherFunction' # OtherFunction
          ;


          Then you could define the functions in visitGetDataDB and visitOtherFunction respectively.



          All that's assuming that you want function names to be keywords (which implies that there can't be user-definable functions). If you don't, you should not have separate tokens for function names, so zero-argument functions and variables become indistinguishable syntactically (unless you add a requirement to add () for functions, but it doesn't look like that's what you want). So you should just have one rule that could be either a variable or a zero-argument function and then check whether the given identifier is the name of a function in visitVariableOrNullaryFunction (which maybe you'd just call visitVariable for brevity).






          share|improve this answer





















          • Dear sepp2K, thanks for the answer, I managed to add my function implementation.
            – OceanWavez
            Nov 13 at 1:21














          0












          0








          0







          ID : [getDataDB];



          This means that ID matches a single letter that could be either one of g, e, t, D, a or B. What you likely wanted is ID: 'getDataDB'; which matches the string getDataDB. Note that calling this ID is highly misleading.




          where i can put the code for this function




          Are you writing an interpreter using a visitor? Then you'd put the code into the visitFunction method or rather in a getDataDB method that you call from visitFunction if the function name was equal to getDataDB (right now that would always be the case, but I'm assuming you eventually want to introduce more than one function).



          Alternatively you could also structure your grammar slightly differently like this (removing the ID rule):



          function : 'getDataDB' # GetDataDB
          | 'otherFunction' # OtherFunction
          ;


          Then you could define the functions in visitGetDataDB and visitOtherFunction respectively.



          All that's assuming that you want function names to be keywords (which implies that there can't be user-definable functions). If you don't, you should not have separate tokens for function names, so zero-argument functions and variables become indistinguishable syntactically (unless you add a requirement to add () for functions, but it doesn't look like that's what you want). So you should just have one rule that could be either a variable or a zero-argument function and then check whether the given identifier is the name of a function in visitVariableOrNullaryFunction (which maybe you'd just call visitVariable for brevity).






          share|improve this answer













          ID : [getDataDB];



          This means that ID matches a single letter that could be either one of g, e, t, D, a or B. What you likely wanted is ID: 'getDataDB'; which matches the string getDataDB. Note that calling this ID is highly misleading.




          where i can put the code for this function




          Are you writing an interpreter using a visitor? Then you'd put the code into the visitFunction method or rather in a getDataDB method that you call from visitFunction if the function name was equal to getDataDB (right now that would always be the case, but I'm assuming you eventually want to introduce more than one function).



          Alternatively you could also structure your grammar slightly differently like this (removing the ID rule):



          function : 'getDataDB' # GetDataDB
          | 'otherFunction' # OtherFunction
          ;


          Then you could define the functions in visitGetDataDB and visitOtherFunction respectively.



          All that's assuming that you want function names to be keywords (which implies that there can't be user-definable functions). If you don't, you should not have separate tokens for function names, so zero-argument functions and variables become indistinguishable syntactically (unless you add a requirement to add () for functions, but it doesn't look like that's what you want). So you should just have one rule that could be either a variable or a zero-argument function and then check whether the given identifier is the name of a function in visitVariableOrNullaryFunction (which maybe you'd just call visitVariable for brevity).







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 11 at 22:26









          sepp2k

          293k38593609




          293k38593609












          • Dear sepp2K, thanks for the answer, I managed to add my function implementation.
            – OceanWavez
            Nov 13 at 1:21


















          • Dear sepp2K, thanks for the answer, I managed to add my function implementation.
            – OceanWavez
            Nov 13 at 1:21
















          Dear sepp2K, thanks for the answer, I managed to add my function implementation.
          – OceanWavez
          Nov 13 at 1:21




          Dear sepp2K, thanks for the answer, I managed to add my function implementation.
          – OceanWavez
          Nov 13 at 1:21


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53252897%2fusing-antlr4-to-create-functions-with-no-argument%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          這個網誌中的熱門文章

          Academy of Television Arts & Sciences

          L'Équipe

          1995 France bombings