Разработка лексического анализатора и парсера в C#
Я собираюсь разработать компилятор с помощью Gold Parse Builder (GPB) для разработки лексического анализатора и анализатора. У меня есть вход x1 = x3/(x2/x5);
и нужно его вывод, как показано ниже:
[ 1] Variable x1 at 1,1
[ 2] Equals = at 1,4
[ 3] Variable x3 at 1,6
[ 4] Divide / at 1,8
[ 5] LeftParen ( at 1,9
[ 6] Variable x2 at 1,10
[ 7] Divide / at 1,12
[ 8] Variable x5 at 1,13
[ 9] RightParen ) at 1,15
[ 10] Semi ; at 1,16
Я могу напечатать этот вывод, потому что у меня есть грамматика для этого. Но мой вопрос, как получить токены один за другим, как при первом индексе x1 (Если я попытаюсь прочитать его по символу по символу, то на выходе получится x и 1, а не x1, я пытаюсь отделить его от пробелов, тогда как насчет x3 / (х2 / х5)).
Дайте мне некоторое представление об этом
Заранее спасибо.
1 ответ
Вы можете создать анализатор либо с регулярными выражениями, либо зациклив строку и читая соответствующую информацию, как следующий фрагмент кода.
Я включаю только сам синтаксический анализатор, так как остальное может быть выведено из способа, которым он получает вызов или как он используется. Вам все равно нужно проверить, в каком положении начинается токен, но я думаю, это должно быть достаточно просто.
public class FormulaReader : IFormulaReader
{
protected static readonly IToken EQUALIZE = new Token(TokenType.EQUALIZER, "=");
protected static readonly IToken ADD = new Token(TokenType.MODIFIER, "+");
protected static readonly IToken SUBTRACT = new Token(TokenType.MODIFIER, "-");
protected static readonly IToken DIVIDE = new Token(TokenType.MODIFIER, "/");
protected static readonly IToken MULTIPLY = new Token(TokenType.MODIFIER, "*");
protected static readonly IToken GROUPSTART = new Token(TokenType.GROUPSTART, "(");
protected static readonly IToken GROUPEND = new Token(TokenType.GROUPEND, ")");
public IFormula Parse(string textRepresentation)
{
IList<IToken> tokenList = new List<IToken>()
{
EQUALIZE, ADD, SUBTRACT, DIVIDE, MULTIPLY, GROUPSTART, GROUPEND
};
IFormula formula = new Formula();
IToken currentToken = new Token(TokenType.IDENTIFIER, "");
bool equalizerFound = false;
for (int i = 0, len = textRepresentation.Length; i < len; i++)
{
string item = textRepresentation[i].ToString();
if (item == " ")
{
continue;
}
IToken selectedToken = (from t in tokenList where string.Equals(t.Text, item) select t).FirstOrDefault();
if (selectedToken == null)
{
currentToken.Text += item;
}
else
{
if (!string.IsNullOrWhiteSpace(currentToken.Text))
{
// contains an identifier
formula.Add(currentToken, equalizerFound);
}
if (selectedToken.TokenType != TokenType.EQUALIZER)
{
formula.Add(selectedToken, equalizerFound);
}
else
{
equalizerFound = true;
}
currentToken = new Token(TokenType.IDENTIFIER, "");
}
}
return formula;
}
}