java - 仅 ANTLR 匹配声明
问题描述
我正在尝试使用 ANTLR4 编写一个解析器,它应该从hyperledger解析一个非常简单的模型文件:
asset Car identified by id {
o String id
o String model
--> Owner owner
}
participant Owner identified by id {
o String id
o String name
}
transaction Auction {
--> Car asset
o String newValue
}
我在事务中遇到问题:我不能为 Car 类型的变量命名为“资产”,这在语言规范中是有效的。ANTLR 解析器并不期望这样。我得到一个类似的异常:mismatched input 'o' expecting {'[', IDENTIFIER}
我知道原因是我的语法中的assetDeclaration,它也检测到事务中的asset关键字。
有没有办法忽略交易中的资产?或者我可以使声明更具体,以便在资产位于开头并后跟字母时触发?
这是我的资产声明:
assetDeclaration: ASSET IDENTIFIER
(EXTENDS typeType)?
IDENTIFIED
IDENTIFIER
classBody;
还有我的交易声明:
transactionDeclaration: TRANSACTION IDENTIFIER
classBody
;
资产、交易等定义为:
ASSET: 'asset';
TRANSACTION: 'transaction';
IDENTIFIED: 'identified by';
PARTICIPANT: 'participant';
其余的语法类似于 GitHub 上提供的JavaGrammar
解决方案
如果asset
允许出现在允许标识符的任何地方,您可以定义identifier: IDENTIFIER | ASSET;
然后identifier
在任何地方使用而不是IDENTIFIER
.
如果asset
仅在允许标识符的某些地方允许,则应(IDENTIFIER | ASSET)
在这些地方明确写入。
这同样适用于任何其他也可以作为标识符合法的关键字。