【发布时间】:2018-02-20 14:44:28
【问题描述】:
我有这个语法:
grammar ProcedureHeaderLanguage ;
@header
{
package com.company.generated.antlr.atr;
}
fragment DIGIT
: '0'..'9'
;
fragment A
: [aA]
;
fragment B
: [bB]
;
fragment C
: [cC]
;
fragment D
: [dD]
;
fragment E
: [eE]
;
fragment F
: [fF]
;
fragment G
: [gG]
;
fragment H
: [hH]
;
fragment I
: [iI]
;
fragment J
: [jJ]
;
fragment K
: [kK]
;
fragment L
: [lL]
;
fragment M
: [mM]
;
fragment N
: [nN]
;
fragment O
: [oO]
;
fragment P
: [pP]
;
fragment Q
: [qQ]
;
fragment R
: [rR]
;
fragment S
: [sS]
;
fragment T
: [tT]
;
fragment U
: [uU]
;
fragment V
: [vV]
;
fragment W
: [wW]
;
fragment X
: [xX]
;
fragment Y
: [yY]
;
fragment Z
: [zZ]
;
fragment DIGIT_PAIR
: DIGIT DIGIT
;
fragment ALPHA
: 'a'..'z'
| 'A'..'Z'
;
SEMICOLON
: ';'
;
HYPHEN
: '-'
;
PROCEDURE_IDENTIFIER
: P R O C E D U R E
;
COMMA
: ','
;
LEFT_PARENTHESIS
: '('
;
RIGHT_PARENTHESIS
: ')'
;
dataField
: IDENTIFIER
;
nameField
: dataField
;
parameterNameField
: dataField
;
dataTypeField
: dataField
;
IN
: I N
;
WS
: (' ' | '\t' | '\r' | '\n')+ -> skip
;
IDENTIFIER
: (ALPHA | '_') (ALPHA | DIGIT | '_')*
;
COMMENT
: HYPHEN HYPHEN
;
parameterPair
: parameterNameField IN dataTypeField
;
procedureName
: PROCEDURE_IDENTIFIER nameField
;
procedureParameter
: LEFT_PARENTHESIS parameterPair (COMMA parameterPair)* RIGHT_PARENTHESIS
;
procedure
: procedureName procedureParameter SEMICOLON
;
procedures
: procedure (procedure)*
;
它能够解析以下示例:
sorten_COBB_SEK in number,
sorten_COBB_VORG in number,
但是解析文件不仅包含这些数据。
它还将存储一些可选且非强制性的信息。
我知道我可以简单地告诉他们使用? 是可选的,但这并不是那么简单。
我还有这个例子:
sorten_FEUCHTE_MIN in number,
sorten_FEUCHTE_MAX in number,
sorten_FEUCHTE_SPERR in number,
sorten_LEIMUNG in varchar2, -- J or N
sorten_BEMERKUNG in varchar2
-- J or N 与条目 sorten_LEIMUNG 相关联,我想获取该条目的信息。问题是分隔符 COMMA 在我要解析的评论之前。
所以像这样的一些语法是行不通的:
parameterPair
: parameterNameField IN dataTypeField COMMA? COMMENT? dataField?
;
procedureParameter
: LEFT_PARENTHESIS parameterPair (parameterPair)* RIGHT_PARENTHESIS
;
如何实现为同一条目(同一行)注册评论的目标?
编辑: 如前所述,上述语法将正确解析第一个示例。但是第二个会坏掉。它会将or 检测为新的parameterName。
通过第二个语法更改,我能够解析-- J,而其余的将被检测为新的参数名称。
我如何告诉 antlr 解析我希望的方式,或者这是我最好告诉用户不要在他的 cmets 中使用空格的限制?
【问题讨论】:
标签: parsing antlr grammar antlr4