あなたの状況は、ドメイン固有言語の完璧なケースです。DSLを使用すると、「数式言語」に許容される文法を指定し、ユーザーにフィードバックを提供したり、結果を計算したりできます。
Antlrはこのための非常に優れたツールです。パーサー/レキサージェネレーターです。基本的に、Antlr独自の記述DSLで文法を指定すると、選択した言語で堅牢なレクサーとパーサーが生成されます。
たとえば、あなたの言語が簡単な計算を可能にする場合、これは(antlrのwikiからの)antlrの言語で指定される方法です:
grammar SimpleCalc;
options {
language=CSharp2;
}
tokens {
PLUS = '+' ;
MINUS = '-' ;
MULT = '*' ;
DIV = '/' ;
}
@members {
public static void Main(string[] args) {
SimpleCalcLexer lex = new SimpleCalcLexer(new ANTLRFileStream(args[0]));
CommonTokenStream tokens = new CommonTokenStream(lex);
SimpleCalcParser parser = new SimpleCalcParser(tokens);
try {
parser.expr();
} catch (RecognitionException e) {
Console.Error.WriteLine(e.StackTrace);
}
}
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
expr : term ( ( PLUS | MINUS ) term )* ;
term : factor ( ( MULT | DIV ) factor )* ;
factor : NUMBER ;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
NUMBER : (DIGIT)+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
fragment DIGIT : '0'..'9' ;
DSL全般について詳しくは、こちらをご覧ください。