Разработка лексического анализатора и парсера в 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;
    }
}
Другие вопросы по тегам