我正在使用Antlr (4.3)的最新版本来解析这个简单的源文件。我正在使用Visual外接程序,但这与我的问题没有任何关系。
源文件:
OBJECT Codeunit 80 Sales-Post
{
OBJECT-PROPERTIES
{
Date=11/12/10;
Time=12:00:00;
Version List=NAVW16.00.10,NAVBE6.00.01;
}
}这应该是非常简单的解析,但是在解析过程中,我始终会得到两个错误:
line 1:16 mismatched input '80' expecting DOCUMENT_ID
line 5:4 mismatched input 'Date' expecting {DOCUMENT_PROPERTY_ID, '}'}完整的语法:
grammar Cal;
/*
* Parser Rules
*/
document
: document_header OPEN_BRACE document_content CLOSE_BRACE
;
document_header
: OBJECT_DEFINITION DOCUMENT_TYPE DOCUMENT_ID DOCUMENT_NAME
;
document_content
: document_properties
;
document_properties
: OBJECT_PROPERTIES OPEN_BRACE document_property* CLOSE_BRACE
;
document_property
: DOCUMENT_PROPERTY_ID EQ DOCUMENT_PROPERTY_VALUE LINE_TERM
;
/*
* Lexer Rules
*/
OBJECT_PROPERTIES
: 'OBJECT-PROPERTIES'
;
OBJECT_DEFINITION
: 'OBJECT'
;
DOCUMENT_TYPE
: 'Codeunit'
| 'Table'
;
DOCUMENT_PROPERTY_VALUE
: ([0-9a-zA-Z]|'_'|'-'|'.'|'/'|','|':')+
;
DOCUMENT_PROPERTY_ID
: 'Date'
| 'Time'
| 'Version List'
;
DOCUMENT_ID
: [0-9]+
;
DOCUMENT_NAME
: ID
;
OPEN_BRACE
: '{'
;
CLOSE_BRACE
: '}'
;
LINE_TERM
: ';'
;
EQ
: '='
;
ID
: ([a-zA-Z]|'_'|'-')+
;
INT
: [0-9]+
;
WS
: [ \t]+ -> channel(HIDDEN)
;
NEWLINE
:'\r'? '\n' -> channel(HIDDEN)
;这是令牌流的输出(令牌被‘<>’包围:
<OBJECT> < > <Codeunit> < > <80> < > <Sales-Post> <
> <{> <
> < > <OBJECT-PROPERTIES> <
> < > <{> <
> < > <Date> <=> <11/12/10> <;> <
> < > <Time> <=> <12:00:00> <;> <
> < > <Version List> <=> <NAVW16.00.10,NAVBE6.00.01> <;> <
> < > <}> <
> <}> <<EOF>发布于 2014-08-19 07:51:28
在ANTLR中,当两个lexer规则可以匹配相同的令牌(长度相同)时,首先出现的规则将获胜。
80可以由DOCUMENT_ID匹配,但也可以由DOCUMENT_PROPERTY_VALUE和INT匹配,所以只需在这里重新排序这些规则。
DOCUMENT_PROPERTY_ID在DOCUMENT_PROPERTY_VALUE下面也有同样的问题(两者都可以与Date匹配)。
我建议您将DOCUMENT_PROPERTY_VALUE放在WS之上:最具体的规则(即关键字)优先,更广泛的规则排在最后。
您还必须摆脱DOCUMENT_ID或INT,因为它们具有相同的定义。其中一个永远也比不上。解析器中似乎没有使用INT,所以只需删除规则即可。
https://stackoverflow.com/questions/25378063
复制相似问题