Click here to Skip to main content
15,917,795 members
Home / Discussions / C#
   

C#

 
QuestionCsharp play wav and vox file Pin
Post524-Mar-07 12:35
Post524-Mar-07 12:35 
AnswerRe: Csharp play wav and vox file Pin
Christian Graus24-Mar-07 12:38
protectorChristian Graus24-Mar-07 12:38 
GeneralRe: Csharp play wav and vox file Pin
Post524-Mar-07 13:42
Post524-Mar-07 13:42 
GeneralRe: Csharp play wav and vox file Pin
Christian Graus24-Mar-07 14:09
protectorChristian Graus24-Mar-07 14:09 
AnswerRe: Csharp play wav and vox file Pin
Vasudevan Deepak Kumar24-Mar-07 15:22
Vasudevan Deepak Kumar24-Mar-07 15:22 
QuestionConverter to convert FoxPro expressions to VB .NET Pin
AndrusM24-Mar-07 11:51
AndrusM24-Mar-07 11:51 
AnswerRe: Converter to convert FoxPro expressions to VB .NET Pin
Christian Graus24-Mar-07 12:37
protectorChristian Graus24-Mar-07 12:37 
GeneralRe: Converter to convert FoxPro expressions to VB .NET Pin
AndrusM24-Mar-07 12:59
AndrusM24-Mar-07 12:59 
I know FoxPro syntax well but I have new in C#.

I found Concordance.pdf file in leafe.com site which shows FoxPro and VB operator and fuction equivalents.

I found parser code in fyireporting.com

vfpconversion.com descibes this utility but this is not open source.

So I'h thinkig about modifying parser from fyireporting.com to parse FoxPro expressions.
Is this best method ?
Is fyireporting.com parser code best way to implement parser in C# ?
Where to find infomation about creating parser in C# ?

Here is code sample from fyireproting parser. This parser parses RDL VB expressions but I hope I can re-write it to parse FoxRpro expressions.
internal class Lexer
{
    private TokenList tokens;
    private CharReader reader;

    /// <summary>
    /// Initializes a new instance of the Lexer class with the specified
    /// expression syntax to lex.
    /// </summary>
    /// <param name="expr">An expression to lex.</param>
    internal Lexer(string expr)
        : this(new StringReader(expr))
    {
        // use this
    }

    /// <summary>
    /// Initializes a new instance of the Lexer class with the specified
    /// TextReader to lex.
    /// </summary>
    /// <param name="source">A TextReader to lex.</param>
    internal Lexer(TextReader source)
    {
        // token queue
        tokens = new TokenList();

        // read the file contents
        reader = new CharReader(source);
    }

    /// <summary>
    /// Breaks the input stream onto the tokens list and returns it.
    /// </summary>
    /// <returns>The tokens list.</returns>
    internal TokenList Lex()
    {
        Token token = GetNextToken();
        while(true)
        {
            if(token != null)
                tokens.Add(token);
            else
            {
                tokens.Add(new Token(null, reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.EOF));
                return tokens;
            }

            token = GetNextToken();
        }
    }

    private Token GetNextToken()
    {
        while(!reader.EndOfInput())
        {
            char ch = reader.GetNext();

            // skipping whitespaces
            if(Char.IsWhiteSpace(ch))
            {
                continue;
            }
            switch(ch)
            {
                case '=':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.EQUAL);
                case '+':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.PLUS);
                case '-':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.MINUS);
                case '(':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.LPAREN);
                case ')':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.RPAREN);
                case ',':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.COMMA);
                case '^':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.EXP);
                case '%':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.MODULUS);
                case '!':
                    if (reader.Peek() == '=')
                    {
                        reader.GetNext();   // go past the equal
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.NOTEQUAL);
                    }
                    else
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.NOT);
                case '&':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.PLUSSTRING);
                case '|':
                    if (reader.Peek() == '|')
                    {
                        reader.GetNext();   // go past the '|'
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.OR);
                    }
                    break;
                case '>':
                    if (reader.Peek() == '=')
                    {
                        reader.GetNext();   // go past the equal
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.GREATERTHANOREQUAL);
                    }
                    else
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.GREATERTHAN);
                case '/':
                    if (reader.Peek() == '*')
                    {   // beginning of a comment of form /* a comment */
                        reader.GetNext();   // go past the '*'
                        ReadComment();
                        continue;
                    }
                    else
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.FORWARDSLASH);
                case '<':
                    if (reader.Peek() == '=')
                    {
                        reader.GetNext();   // go past the equal
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.LESSTHANOREQUAL);
                    }
                    else if (reader.Peek() == '>')
                    {
                        reader.GetNext();   // go past the >
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.NOTEQUAL);
                    }
                    else
                        return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.LESSTHAN);
                case '*':
                    return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.STAR);
                case '"':
                case '\'':
                    return ReadQuoted(ch);
                default:
                    break;
            } // end of swith
            if (Char.IsDigit(ch) || ch == '.')
                return ReadNumber(ch);
            else if (Char.IsLetter(ch) || ch == '_')
                return ReadIdentifier(ch);
            else
                return new Token(ch.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.OTHER);
        }
        return null;
    }

    // Reads a decimal number with optional exponentiation
    private Token ReadNumber(char ch)
    {
        int startLine = reader.Line;
        int startCol = reader.Column;
        bool bDecimal = ch == '.'? true: false;
        bool bDecimalType=false;    // found d or D in number
        bool bFloat=false;          // found e or E in number
        char cPeek;

        string number = ch.ToString();
        while(!reader.EndOfInput() )
        {
            cPeek = reader.Peek();
            if (Char.IsWhiteSpace(cPeek))
                break;

            if (Char.IsDigit(cPeek))
                number += reader.GetNext();
            else if (cPeek == 'd' || cPeek == 'D' && !bFloat)
            {
                reader.GetNext();               // skip the 'd'
                bDecimalType = true;
                break;
            }
            else if (cPeek == 'e' || cPeek == 'E' && !bFloat)
            {
                number += reader.GetNext();     // add the 'e'
                cPeek = reader.Peek();
                if (cPeek == '-' || cPeek == '+')
                {
                    number += reader.GetNext();
                    bFloat = true;
                    if (Char.IsDigit(reader.Peek()))
                        continue;
                }
                throw new ParserException("Invalid number constant.");
            }
            else if (!bDecimal && !bFloat && cPeek == '.')  // can't already be decimal or float
            {
                bDecimal = true;
                number += reader.GetNext();
            }
            else
                break;  // another character
        }

        if (number.CompareTo(".") == 0)
            throw new ParserException("'.' should be followed by a number");

        TokenTypes t;
        if (bDecimalType)
            t = TokenTypes.NUMBER;
        else if (bFloat || bDecimal)
            t = TokenTypes.DOUBLE;
        else
            t = TokenTypes.INTEGER;

        return new Token(number, startLine, startCol, reader.Line, reader.Column, t);
    }

    // Reads an identifier:
    //  Must consist of letters, digits, "_".  "!", "." are allowed
    //  but have special meaning that is disambiguated later
    private Token ReadIdentifier(char ch)
    {
        int startLine = reader.Line;
        int startCol = reader.Column;
        char cPeek;

        StringBuilder identifier = new StringBuilder(30);   // initial capacity 30 characters
        identifier.Append(ch.ToString());
        while(!reader.EndOfInput() )
        {
            cPeek = reader.Peek();
            if (Char.IsLetterOrDigit(cPeek) || cPeek == '.' ||
                cPeek == '!' || cPeek == '_')
                identifier.Append(reader.GetNext());
            else
                break;
        }

        string key = identifier.ToString().ToLower();
        if (key == "and" || key == "andalso")   // technically 'and' and 'andalso' mean different things; but we treat the same
            return new Token(identifier.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.AND);
        else if (key == "or" || key == "orelse")    // technically 'or' and 'orelse' mean different things; but we treat the same
            return new Token(identifier.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.OR);
        else if (key == "not")
            return new Token(identifier.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.NOT);
        else if (key == "mod")
            return new Token(identifier.ToString(), reader.Line, reader.Column, reader.Line, reader.Column, TokenTypes.MODULUS);

        // normal identifier
        return new Token(identifier.ToString(), startLine, startCol, reader.Line, reader.Column, TokenTypes.IDENTIFIER);
    }

    // Quoted string like " asdf " or ' asdf '
    private Token ReadQuoted(char ch)
    {
        char qChar = ch;
        int startLine = reader.Line;
        int startCol = reader.Column;
        StringBuilder quoted = new StringBuilder();

        while(!reader.EndOfInput())
        {
            ch = reader.GetNext();
            if (ch == '\\')
            {
                char pChar = reader.Peek();
                if (pChar == qChar)
                    ch = reader.GetNext();          // got one skip escape char
                else if (pChar == 'n')
                {
                    ch = '\n';
                    reader.GetNext();               // skip the character
                }
                else if (pChar == 'r')
                {
                    ch = '\r';
                    reader.GetNext();               // skip the character
                }
            }
            else if (ch == qChar)
                return new Token(quoted.ToString(), startLine, startCol, reader.Line, reader.Column, TokenTypes.QUOTE);

            quoted.Append(ch);
        }
        throw new ParserException("Unterminated string!");
    }

    // Comment string like /* this is a comment */
    private void ReadComment()
    {
        char ch;

        while(!reader.EndOfInput())
        {
            ch = reader.GetNext();
            if (ch == '*' && reader.Peek() == '/')
            {
                reader.GetNext();           // skip past the '/'
                return;
            }
        }
        throw new ParserException("Unterminated comment!");
    }



Andrus

GeneralRe: Converter to convert FoxPro expressions to VB .NET Pin
Christian Graus24-Mar-07 13:04
protectorChristian Graus24-Mar-07 13:04 
QuestionHow to override property Pin
AndrusM24-Mar-07 11:38
AndrusM24-Mar-07 11:38 
AnswerRe: How to override property Pin
Leslie Sanford24-Mar-07 11:57
Leslie Sanford24-Mar-07 11:57 
GeneralRe: How to override property Pin
AndrusM24-Mar-07 12:06
AndrusM24-Mar-07 12:06 
GeneralRe: How to override property Pin
Insincere Dave24-Mar-07 12:34
Insincere Dave24-Mar-07 12:34 
GeneralRe: How to override property Pin
Christian Graus24-Mar-07 12:34
protectorChristian Graus24-Mar-07 12:34 
GeneralRe: How to override property Pin
Leslie Sanford24-Mar-07 15:11
Leslie Sanford24-Mar-07 15:11 
AnswerRe: How to override property Pin
malharone25-Mar-07 6:43
malharone25-Mar-07 6:43 
QuestionCheckListBox Pin
Saikek24-Mar-07 11:21
Saikek24-Mar-07 11:21 
AnswerRe: CheckListBox Pin
Karl 200024-Mar-07 11:43
Karl 200024-Mar-07 11:43 
AnswerRe: CheckListBox Pin
Rudolf Jan25-Mar-07 10:33
Rudolf Jan25-Mar-07 10:33 
AnswerRe: CheckListBox Pin
Keshav V. Kamat25-Mar-07 17:12
Keshav V. Kamat25-Mar-07 17:12 
Questiondata communication Pin
s_khan_87624-Mar-07 8:21
s_khan_87624-Mar-07 8:21 
AnswerRe: data communication Pin
Christian Graus24-Mar-07 8:30
protectorChristian Graus24-Mar-07 8:30 
GeneralRe: data communication Pin
Leslie Sanford24-Mar-07 10:24
Leslie Sanford24-Mar-07 10:24 
GeneralRe: data communication Pin
Dave Kreskowiak24-Mar-07 11:26
mveDave Kreskowiak24-Mar-07 11:26 
QuestionUnderstanding Control.BeginInvoke()... Pin
Shy Agam24-Mar-07 8:18
Shy Agam24-Mar-07 8:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.