java - 为什么我添加了 "cppInclude"解析器然后整个 g4 不起作用

标签 java antlr antlr4 dsl

g4:

grammar KBDP;

@header {package kbdp.translator.antlr;}

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


KS:'[' ('KS_'|'KA_') MIX+ ']';

STRING : '"' ~[\r\n"]+ '"';

fragment NUM:[0-9]+; VARNAME:[_a-zA-Z-0-9]+;

INCLUDE :'#include' ;

MIX      : CHINESE | VARNAME ;

CHINESE  : ('\u4E00'..'\u9FA5')+ ; ARG     : VARNAME|STRING ;

DB       : '[' '数据库' ']'; SQL      : '[' 'SQL' NUM ']'; SQLRESULT: '[''SQL' NUM '有数据'']'; SQLREADLINE:'[' '列' NUM ']'; RESULTWIRTELINE:'[' '结果集' NUM ']'; RETURNMULTI:'[' '返回值' NUM '有数据' ']'; RETURNSINGLE:'[' '返回值' NUM ']'; PRINT:'[' '打印' ']';    WS: [\r\n \t] -> skip;

prog: kinglangStat+     |     cppStat+;

block:'{' prog* '}';
       kinglangStat:kinglangServiceDeclaration |
             kinglangDBOpen |
             kinglangSQL |
             kinglangSQLResult |
             kinglangSQLReadLine |
             kinglangResultDeclare |
             kinglangResultWriteLine |
             kinglangFunctionCall |
             kinglangFunctionReturnSingle |
             kinglangFunctionReturnMulti |
             kinglangPrintStatus;

kinglangServiceDeclaration: KS  '(' VARNAME? (',' VARNAME)* ')' '{' prog* '}';   kinglangDBOpen:(VARNAME '=')?  DB  '('  (VARNAME|STRING)  ')' ';'; 

kinglangSQL:(VARNAME '=')? SQL '(' STRING? ')'  ';' ;

kinglangSQLResult:SQLRESULT block;   kinglangSQLReadLine:SQLREADLINE '(' VARNAME ')' ';';   kinglangResultDeclare:RESULTWIRTELINE ';';

kinglangResultWriteLine:RESULTWIRTELINE '(' kinglangArg? (',' kinglangArg)* ')' ';';  kinglangArg : VARNAME|STRING ;

kinglangFunctionCall:KS '(' (VARNAME|STRING)? (',' (VARNAME|STRING))* ')' ';';


kinglangFunctionReturnSingle:RETURNSINGLE '(' VARNAME? (',' VARNAME)* ')' ';';

kinglangFunctionReturnMulti:RETURNMULTI block;

kinglangPrintStatus:PRINT '(' VARNAME|STRING ')' ';';

cppStat:  block          |
          cppBreakStat   |
          cppContinueStat|
          cppReturnStat  |
          cppSingleStat  |
          cppIfStat      |
          cppWhileStat   |
          cppGotoStat    |
          cppLabelStat   |
          cppForStat     |
          cppInclude;




cppIfStat: cppIfStatPart cppElseifPart* cppElsePart?;   

cppIfStatPart:'if' '(' expression ')' (cppSingleStat|block)?;

cppElseifPart:'else if' '(' expression ')' (cppSingleStat|block)? ;

cppElsePart:'else' (cppSingleStat|block)?;

cppWhileStat:'while' '(' expression ')' block;

cppForStat:'for' '(' cppForCondition1?';' cppForCondition2?';'cppForCondition3?')' block; cppForCondition1:expression; cppForCondition2:expression; cppForCondition3:expression;

cppBreakStat:'break' ';';

cppContinueStat:'continue' ';';

cppGotoStat:'goto' expression ';' ;

cppLabelStat:VARNAME ':' ;

cppReturnStat: 'return' VARNAME? ';';

cppSingleStat: expression ';';  

cppInclude: INCLUDE ('<'|'"') VARNAME '.' VARNAME ('>'|'"') ';';

expression:  VARNAME |
             STRING |
             '!' expression |
             expression '=' expression |
             expression ('<'|'>') expression |
             expression  expression |
             expression ('+'|'-'|'*'|'/'|'%') expression |
             expression ('=='|'!=') expression |
             expression ('>='|'<=') expression |
             expression ('&&'|'||') expression |
             expression ('++'|'--') |
             ('++'|'--') expression |   
             '(' expression ')'|
             '\'' expression '\'' |
             expression ',' expression |
             expression expression |           //var decl
             expression '<' expression '>' expression |  //class template
             expression '[' expression ']' |         //array
             expression '.' expression |            //class obj
             expression '(' expression ')';         //func call

文字:

[KS_MyTest](name,code)
{
    char szCredit[1024];
    memset(szCredit,0,sizeof(szCredit));

    [数据库]("DB");
    [SQL1]("select * from myTable where name='@name' and code='@code'");

    [SQL1有数据]
    {
        [列0](szCredit);
    }
    [结果集1];
    [结果集1]("ERROE_SUCCESS",0,0);

    [结果集2];
    [结果集2](szCredit);
}

在添加“cppInclude”解析器之前,一切顺利。 但是当我写下文字时:

#include <iostream.h>
[KS_MyTest](name,code)
{
}

分析仪无法正常工作。 它注意到了我:

line 20:0 extraneous input '[KS_MyTest]' expecting {<EOF>, '{', '(', 'if', 'while', 'for', 'break', 'continue', 'goto', 'return', '!', '++', '--', ''', STRING, VARNAME, '#include'}

如何修复该错误?

最佳答案

本次制作:

  prog: kinglangStat+     |     cppStat+;

表示 progkinglangStat 序列或 cppStat 序列。

你的例子是一个cppStat后跟一个kinglangStat(我认为)。这不是prog

<小时/>

How could I fix the bug?

试试这个:

  prog: ( kinglangStat | cppStat )+;

  prog: stat+;
  stat: kinglangStat | cppStat;

(我不是 Antlr 专家。我只是在阅读语法......作为语法。)

关于java - 为什么我添加了 "cppInclude"解析器然后整个 g4 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39467472/

相关文章:

java - 如何解决异常 [Error loading application.groovy due to [java.lang.ArrayIndexOutOfBoundsException] : 0] when deploying war?

javascript - 在 Angular 项目中包含 antlr4 的问题

java - 我可以使用 Antlr 创建的词法分析器/解析器来解析 PDDL 文件并将数据返回给 Java 程序吗?

java - Antlr4 - 是否有使用 ParseTree Walker 的简单示例?

antlr - 将 ANTLR v2 语法迁移到 ANTLR v4

java - 无法启动 Chrome 驱动程序 - Alpine Linux

java - callable 是否按顺序执行?

java - 如何使用比最新 TZupdater 版本使用的文件更新的 IANA 文件更新 Java 时区信息?

java - 如何从ANTLR语法中收集 'returns'

java - antlr4 - 如何实现递归