Antlr 字符串与哪个规则匹配?

Antlr 字符串与哪个规则匹配?,antlr,Antlr,我正在使用在中定义的Java语法 例如,我的用户可以自由输入任何东西 断言图像!=无效的 , public Color[][]平滑(Color[][]图像,int-neighberhoodSize) { ... } , package myapplication.mylibrary; ,及 导入静态java.lang.System.out;//”out'是java.lang.System中的一个静态字段 导入静态屏幕。ColorName.*; 我的程序应该知道输入匹配的语法 到目前

我正在使用在中定义的Java语法

例如,我的用户可以自由输入任何东西

断言图像!=无效的
,

public Color[][]平滑(Color[][]图像,int-neighberhoodSize)
{   
...
}
,

package myapplication.mylibrary;
,及

导入静态java.lang.System.out;//”out'是java.lang.System中的一个静态字段
导入静态屏幕。ColorName.*;
我的程序应该知道输入匹配的语法

到目前为止我所知道的是

var stream=CharStreams.fromString(输入);
ITokenSource lexer=新的JavaLexer(流);
ITokenStream令牌=新的CommonTokenStream(lexer);
解析器=新的JavaParser(令牌);
parser.ErrorHandler=new BailErrorStrategy();
尝试
{
var tree=parser.statement();
WriteLine(“输入是一条语句”);
}
捕获(例外e)
{
WriteLine(“输入不是语句”);
}

有没有更好的方法来检查输入是否与100条规则中的任何一条匹配?

没有,除了反复试验之外,没有其他方法了。请注意,生成的解析器具有以下属性:

公共静态最终字符串[]规则名称
您可以将其与反射结合使用,自动调用所有解析器规则,而不是手动尝试

另外,尝试
parser.statement()
可能还不够:输入
String s=“mu”;FUBAR
可以由
parser.statement()
正确解析,并在令牌流中保留尾随的
标识符(
FUBAR
)。毕竟,
语句
规则可能不会以
EOF
令牌结束,从而迫使解析器使用所有令牌。在确定输入是否被某个解析器规则成功解析之前,您可能必须手动检查是否使用了所有令牌。另请参见此问答:

,除非您的意思是您的用户可以输入任何内容(我想,事实并非如此)

您可以添加一个解析器规则,其中包括用户可以输入的每个构造的备选方案。您可能需要对订单稍加注意

由于解析器规则的计算是递归下降的,如果您的新规则没有被任何其他规则引用,它将不会对语法的其余部分产生影响


可能值得一试。

parser.statement()
只是一个例子。我必须编写100个try-catch块,每个块检测不同的规则。如果我正确地查看了您的答案,那么关键字是reflection,您要求我使用reflection调用这些规则方法,而不是手动编写100次。这是正确的。也请注意我对EOF的评论