简体   繁体   English

如何将生成的词法分析器/解析器从Antlr4集成到我的java项目中

[英]How to integrate the generated lexer/parser from Antlr4 into my java project

please bear with me I'm not a coding expert. 请耐心等待我不是编码专家。

I built a grammar in ANTLR4 using ANTRWorks 2. I tested the grammar with various teststrings and it works fine within there. 我使用ANTRWorks 2在ANTLR4中构建了一个语法。我用各种测试字符串测试了语法,它在那里工作得很好。 Now what I'm having trouble with is using the generated lexer and parser in my own code. 现在我遇到的麻烦就是在我自己的代码中使用生成的词法分析器和解析器。 As code generation target I'm using Java. 作为代码生成目标,我正在使用Java。

Here is the code I'm trying: 这是我正在尝试的代码:

String s = "query(std::map .find(x) == y): bla";
ANTLRInputStream input = new ANTLRInputStream(s);
TokenStream tokens = new CommonTokenStream(new pqlcLexer(input)); 

pqlcParser parser = new pqlcParser(tokens); 
ParseTree tree = parser.query();
System.out.println(tree.toStringTree());  

The Output of that is just "query", which is my starting rule. 输出只是“查询”,这是我的起始规则。 I would expect something like the output from ANTLRworks: "(query (quant_expr query ( (match std::map . find ( (cm x) ) == (cm (numeral 256))) ) : (query (qexpr bla))))" Here is the tree visually: http://puu.sh/94Nlx/00dc35bb05.png 我希望类似于ANTLRworks的输出:“(query(quant_expr query((match std :: map。find((cm x))==(cm(number 256)))):( query(qexpr bla)) ))“这是树的视觉: http//puu.sh/94Nlx/00dc35bb05.png

Which methods do I have to call to get the proper syntax tree as output? 我必须调用哪些方法才能获得正确的语法树作为输出?

Here is the generated Parser for reference: http://pastebin.com/Lb34TyRW and the grammar: 以下是生成的Parser供参考: http//pastebin.com/Lb34TyRW和语法:

// Lexer

//Schlüsselwörter
EXISTS: 'exists';
REDUCE: 'reduce';
QUERY: 'query';
INT: 'int';
DOUBLE: 'double';
CONST: 'const';
STDVECTOR: 'std::vector';
STDMAP: 'std::map';
STDSET: 'std::set';

INTEGER_LITERAL  : (DIGIT)+ ;
fragment DIGIT: '0'..'9';
DOUBLE_LITERAL : DIGIT '.' DIGIT+;

LPAREN          : '(';
RPAREN          : ')';
LBRACK          : '[';
RBRACK          : ']';
DOT             : '.';
EQUAL           : '==';
LE              : '<=';
GE              : '>=';
GT              : '>';
LT              : '<';
ADD             : '+';
MUL             : '*';
AND             : '&&';
COLON           : ':';

IDENTIFIER    :   JavaLetter JavaLetterOrDigit*;
fragment JavaLetter    :   [a-zA-Z$_]; // these are the "java letters" below 0xFF
fragment JavaLetterOrDigit    :   [a-zA-Z0-9$_]; // these are the "java letters or digits" below 0xFF
WS  
    :  [ \t\r\n\u000C]+ -> skip  
    ;
COMMENT
    :   '/*' .*? '*/' -> skip
    ;

LINE_COMMENT
    :   '//' ~[\r\n]* -> skip
    ;


// Parser

//start_rule: query;

query :
      quant_expr
      | qexpr+
      | IDENTIFIER // order IDENTIFIER and qexpr+?
      | numeral
      //| c_expr TODO

      ;

c_type : INT | DOUBLE | CONST;
bin_op: AND | ADD | MUL | EQUAL | LT | GT | LE| GE;


qexpr:
         LPAREN query RPAREN bin_op_query? 
         // query bin_op query
         | IDENTIFIER  bin_op_query? // copied from query to resolve left recursion problem
         | numeral bin_op_query?  // ^
         | quant_expr bin_op_query? // ^
           // query.find(query)
         | IDENTIFIER  find_query? // copied from query to resolve left recursion problem
         | numeral find_query?  // ^
         | quant_expr find_query?
           // query[query]
          | IDENTIFIER  array_query? // copied from query to resolve left recursion problem
         | numeral array_query?  // ^
         | quant_expr array_query?

     // | qexpr bin_op_query // bad, resolved by quexpr+ in query 
     ;

bin_op_query: bin_op query bin_op_query?; // resolve left recursion of query bin_op query

find_query: '.''find' LPAREN query RPAREN;
array_query: LBRACK query RBRACK;

quant_expr:
    quant id ':' query
          | QUERY LPAREN match RPAREN ':' query
          | REDUCE LPAREN IDENTIFIER RPAREN id ':' query
    ;

match:
         STDVECTOR LBRACK id RBRACK EQUAL cm
     | STDMAP '.''find' LPAREN cm RPAREN EQUAL cm
     | STDSET '.''find' LPAREN cm RPAREN
     ;

cm:
    IDENTIFIER
  | numeral
  // | c_expr TODO
  ;

quant :
          EXISTS;

id :
     c_type IDENTIFIER
     | IDENTIFIER // Nach Seite 2 aber nicht der Übersicht. Laut übersicht id -> aber dann wäre Regel 1 ohne +
   ;

numeral :
            INTEGER_LITERAL
        | DOUBLE_LITERAL
        ;

Apart from the fact that Java Classes should start with an uppercase letter (so you should rename your grammar, so it starts with an uppercase letter) your last line should be 除了Java Classes应该以大写字母开头(因此你应该重命名你的语法,所以它以大写字母开头),你的最后一行应该是

System.out.println(tree.toStringTree(parser));

to print the tree. 打印树。 Otherwise the tree doesnÄt know which parser to use and only outputs what you described. 否则,树不知道要使用哪个解析器,只输出您描述的内容。

EDIT 编辑

When naming your grammar PQLC the following code 在为您的语法PQLC命名时,请使用以下代码

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

public class Test {
    public static void main(String[] args) throws Exception {
        String query = "query(std::map .find(x) == y): bla";
        ANTLRInputStream input = new ANTLRInputStream(query);
        PQLCLexer lexer = new PQLCLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        PQLCParser parser = new PQLCParser(tokens);
        ParseTree tree = parser.query(); // begin parsing at query rule
        System.out.println(tree.toStringTree(parser)); // print LISP-style tree
    }
}

produces this output with ANTLR v4.2 at my machine: 在我的机器上使用ANTLR v4.2生成此输出:

(query (quant_expr query ( (match std::map . find ( (cm x) ) == (cm y)) ) : (query (qexpr bla))))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM