Парсер рекурсивного спуска выражения в скобках - PullRequest
1 голос
/ 08 января 2012

Для правил грамматики, перечисленных ниже, я хочу написать синтаксический анализатор с рекурсивным спуском:

Expression -> Digit | '(' Expression Op Expression ')'

Op  -> +|*

Digit -> 0|1|2|3|4|5|6|7|8|9

Итак, я использовал следующий код C #:

public class Expression 
{
    public Expression(){}
    //Note: The Form 2 Grammar , Expression Structre
    public char  type;//parenthesized or digit
    public int value;
    public Expression left;
    public char op;
    public Expression right ;

}
public class Token
{
    public Token() { }
    public char type;
    public char value;
}
int current=-1;
Token token;
public class Form1:Form
{
    public Form1()
    {
        InitializeComponent();
        token = new Token();
    }
    private void Get_Next_Token()
    {
        int n = richTextBox1.Text.Length;
        char ch;
        current++;
        if (current < n)
        {
            ch = richTextBox1.Text[current];
            if (0 <= ch-'0' && ch-'0' <= 9)
                token.type = 'D';
            else
                token.type = ch;
            token.value = ch;

        }
    }
    private int Parse_Operator(ref char op)
    {
        if (token.type == '*' || token.type == '+')
        {
            op = token.type;
            Get_Next_Token();
            return 1;
        }
        Get_Next_Token();
        return 0;
    }
    private int Parse(ref Expression expr_p)
    {
        Expression expr = expr_p = new Expression();
        if (token.type == 'D')
        {
            expr.value = token.value - '0';
            expr.type = 'D';
            Get_Next_Token();
            return 1;
        }
        if (token.type == '(')
        {
            expr.type = 'P';
            Get_Next_Token();
            if (Parse(ref expr.left) == 0)
            {
                Error("Missing Left expression");
            }
            if (Parse_Operator(ref expr.op) == 0)
            {
                Error("Missing Operator");

            }
            if (Parse(ref expr.right) == 0)
            {
                Error("Missing Right Expression");

            }
            if (token.type != ')')
            {
                Error("Missing )");

            }
            Get_Next_Token();
            return 1;
        }                

        return 0;
    }
    private void Error(string msg)
    {
        listBox1.Items.Add(msg);   
    }



    private void button2_Click(object sender, EventArgs e)
    {
        Expression parenthesized_expr = new Expression();
        //Reset
        current = -1;

        ////***End Reset
        Get_Next_Token();
        listBox1.Items.Clear();
        if (token.value == '(')
        {
            Parse(ref parenthesized_expr);


            //listBox1.Items.Add("Build Succeeded");
        }
        else
        {
            Error("Missing Initial (");
        }


    }
}

Парсер отлично подходит для чего-токак (2 + 3), но не работает для (3+ (2 + 4) * 4)

Так как мне сделать парсер для анализа выражения до последнего?

...