解析包含点(。)的输入字符串未在ANTLR中得到验证

时间:2018-07-25 21:08:44

标签: antlr

我有一个应用程序“ abc”,并且试图解析作业(输入字符串)。

如果作业名称包含点(。),则abc抛出错误以显示作业状态

»abc status -jn UpgradeJob_435_1.61.4_xyz_1000_KPI_Upgrade_confirm

Error 2001 : Command Syntax error. extraneous input 
'.61.4_xyz_1000_KPI_Upgrade_confirm' expecting

{<EOF>, JOB, JOB_OWNER, JOB_TYPE, JOB_STATUS}
Suggested Solution : Please check online help for correct syntax

如果将工作名称用双引号括起来,则效果很好。

为解决此问题,我在命令解析器中添加了DOT规则。以下是所做更改的摘要。

解析器的代码段

jobNameQuery : 

    JOB (id | DOT | stringWithQuotes)

;

jobOwnerQuery: 
    JOB_OWNER (id | DOT | stringWithQuotes)
;

Lexar片段:

DOT : '.' ;

ID: [a-zA-Z0-9_]([a-zA-Z0-9_@{}()#$%^~!`'-] | '[' | ']' )*;

错误消息:

命令语法错误。多余的输入“ .1”,期望{,JOB,JOB_OWNER,JOB_TYPE,JOB_STATUS}

有人可以建议我需要进行哪些更改。

1 个答案:

答案 0 :(得分:0)

根据您的确切要求,将.设为ID中允许的字符之一,或进行更改

(id | DOT | stringWithQuotes)

(
    id (DOT id)*
|   stringWithQuotes
)

现在,您允许带引号的字符串,标识符或单个点-不允许标识符与点混合。