从 lexer/parser 语法生成产生式
Generating productions from lexer/parser grammar
有没有办法根据给定的语法生成(所有可能的)句子?
假设我有语法:
grammar Drink;
//Parser Rules
drinkSentence : ARTICLE? DRINKING_VESSEL OF drink ;
drink : TEXT;
// Lexer Rules
ARTICLE : 'the' | 'an' | 'a' ;
OF : 'of' ;
DRINKING_VESSEL : 'cup' | 'pint' | 'shot' | 'mug' | 'glass' ;
TEXT : ('a'..'z')+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ -> skip ;
是否可以从中生成所有可能的 drinkSentences?我明白,例如TEXT 有大量可能的组合,但为了举例,我们假设它只能包含大约 4 个字母。
不,任何内置的 ANTLR 功能都不可能做到这一点。
这当然可行,但您必须编写一个工具来完成这项工作。据我所知,没有现成的工具可以做到这一点。一种可能的方法是遍历生成的 ATN 并从中构建可能的输入。
但是,我想知道你需要这样一个生成器。是否要为解析器创建测试输入?如果是这样,你应该再考虑一下这个想法。您的解析器将始终根据为其创建的语法成功解析正确的输入(假设此处没有 ANTLR4 错误)。然后,您如何使用始终正确的输入来测试始终正确工作的解析器?
有没有办法根据给定的语法生成(所有可能的)句子?
假设我有语法:
grammar Drink;
//Parser Rules
drinkSentence : ARTICLE? DRINKING_VESSEL OF drink ;
drink : TEXT;
// Lexer Rules
ARTICLE : 'the' | 'an' | 'a' ;
OF : 'of' ;
DRINKING_VESSEL : 'cup' | 'pint' | 'shot' | 'mug' | 'glass' ;
TEXT : ('a'..'z')+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ -> skip ;
是否可以从中生成所有可能的 drinkSentences?我明白,例如TEXT 有大量可能的组合,但为了举例,我们假设它只能包含大约 4 个字母。
不,任何内置的 ANTLR 功能都不可能做到这一点。
这当然可行,但您必须编写一个工具来完成这项工作。据我所知,没有现成的工具可以做到这一点。一种可能的方法是遍历生成的 ATN 并从中构建可能的输入。
但是,我想知道你需要这样一个生成器。是否要为解析器创建测试输入?如果是这样,你应该再考虑一下这个想法。您的解析器将始终根据为其创建的语法成功解析正确的输入(假设此处没有 ANTLR4 错误)。然后,您如何使用始终正确的输入来测试始终正确工作的解析器?