首页 > 解决方案 > 仅 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

标签: javaantlrhyperledger-composer

解决方案


如果asset允许出现在允许标识符的任何地方,您可以定义identifier: IDENTIFIER | ASSET;然后identifier在任何地方使用而不是IDENTIFIER.

如果asset仅在允许标识符的某些地方允许,则应(IDENTIFIER | ASSET)在这些地方明确写入。

这同样适用于任何其他也可以作为标识符合法的关键字。


推荐阅读