为什么我添加 "cppInclude" 解析器然后整个 g4 不起作用
Why I add the "cppInclude" parser then the whole g4 doesn't work
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+;
表示 prog
是 kinglangStat
的序列或 cppStat
的序列。
您的示例是 cppStat
后跟 和 kinglangStat
(我认为)。那不是 prog
.
How could I fix the bug?
试试这个:
prog: ( kinglangStat | cppStat )+;
或
prog: stat+;
stat: kinglangStat | cppStat;
(我不是Antlr专家。我只是在阅读语法......作为语法。)
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+;
表示 prog
是 kinglangStat
的序列或 cppStat
的序列。
您的示例是 cppStat
后跟 和 kinglangStat
(我认为)。那不是 prog
.
How could I fix the bug?
试试这个:
prog: ( kinglangStat | cppStat )+;
或
prog: stat+;
stat: kinglangStat | cppStat;
(我不是Antlr专家。我只是在阅读语法......作为语法。)