Я улучшаю инструмент тестирования интеграции, который используется для вызовов RP C. В настоящее время я могу отвечать на вызовы с помощью простых ответов c, например:
<PackageType>Success/Reply</PackageType> <Server>default</Server> <Date>13.01.2020</Date>...
Чтобы не перекомпилировать код для различных тестовых случаев, протоколов и разработчиков, Я хочу интегрировать небольшой DSL. Это должно работать как в следующем примере:
<PackageType>{Random ( "Success","Error")}/Reply</PackageType><Server>{Input ("COMPUTERNAME") }</Server> <Date>{DateTime}</DateTime>
<PackageType>Error/Reply</PackageType><Server>sv_15</Server><Date>01/13/2020 16:45:23</Date>
Для этого я разработал следующую грамматику в Antlr:
grammar GRAM;
expression : expression expression #ExpressionWalk
| OPENTAG instruction CLOSETAG #GetInstruction
| STRING #StringBlock
;
instruction : function ( '(' param(',' param)* ')' )? #InstructionBuilder
;
function : FUNC; #FunctionCreator
param : '"' STRING '"' #StringParam
| NEGATOR? INT #IntParam
;
STRING : (~( OPENTAG | CLOSETAG | '"' | ',' ) )+;
INT : [0-9]+;
NEGATOR : '-';
OPENTAG : '{' ;
CLOSETAG : '}';
FUNC : 'Random' | 'Input' | 'DateTime' ;
WS : [ \r\n\t] -> skip;
Поскольку TestRig не работает с целью CSharp, я используя следующий код для проверки моей грамматики:
public static void Main(string[] args)
{
string input = "albalbalb{ Random ( \"string1\" , \"string2\")}blablabla ";
ICharStream stream = CharStreams.fromstring(input);
ITokenSource lexer = new GRAMLexer(stream);
ITokenStream tokens = new CommonTokenStream(lexer);
GRAMParser parser = new GRAMParser(tokens);
parser.BuildParseTree = true;
IParseTree tree = parser.expression();
Console.WriteLine(tree.ToStringTree(parser));
Console.ReadKey();
}
Когда я запускаю код, я получаю следующую ошибку:
line 1:11 mismatched input ' Random ' expecting FUNC
line 1:19 no viable alternative at input ','
Пробелы вокруг 'Random' говорят мне, что как-то Antlr не может отделить их от лексера FUN C. Это также верно, когда я изменяю (-> skip) вручную помещенные инструкции "WS *" (мне это нужно, если я хочу разрешить пробелы в строках).
Кто-нибудь знает, что я делаю не так?
Заранее спасибо!