Population

Simple Scanner

    A.First Edition

    This is first edition of my simple scanner, and there is nothing important except it uses the DFA transition

    functions. I put all transition functions in an uniform format so that they can be put into an array of function

    pointers. The return value of each function is the index of state it leads to. So we can call the series of

    checking functions in a comfortable way. At least it suits my habit.

    B.The problem

    To write a simplest scanner to check if a token is a legal identifier of C++. That is, it should

    starts with a alphabetic character and followed by alphabetic or digital character or '-'. But there

    should be at most one '-' which is not the end of token.

C.The idea of program
กก

The translation of DFA into programming language can be one-to-one and it must be! The scanner

continually call each scan function after it checks if the token ends. And if the return value of

checking function is -1---means rejected by checking, it returns false. If the string ends, scanner

checks if the state is final state by looking at the boolean array of state. Very similar to an DFA?

It actually is. Since each state transition function returns a deterministic value. This is

FUNCTION DEFINITION BY DISCRETE MATHEMATICS!

    D.The major functions

    C.Further improvement

    กก

    #include <iostream>

    using namespace std;

    int scan0(char ch);
    int scan1(char ch);
    int scan2(char ch);

    bool finalStates[3]={false, true, false};

    int (*scanArray[3])(char ch)={scan0, scan1, scan2};

    bool scanner(char* str);

    int main()
    {
    	char buffer[20];
    	cout<<"please input your token\nc:>";
    	while (true)
    	{
    		cin>>buffer;
    		if (strcmp(buffer, "exit")==0)
    		{
    			break;
    		}
    		cout<<buffer<<(scanner(buffer)?" is accepted!":" is rejected!")<<endl;
    		cout<<"c:>";
    	}

    	return 0;
    }

    bool scanner(char* str)
    {
    	int counter=0, result=0;
    	while (str[counter]!=NULL)//scan all char
    	{
    		if (result==-1)//rejected
    		{
    			return false;
    		}
    		result = scanArray[result](str[counter++]);//recursive?loop?
    	}
    	return finalStates[result];
    }

    int scan0(char ch)
    {
    	if (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
    	{
    		return 1;
    	}
    	else
    	{
    		return -1;
    	}
    }

    int scan1(char ch)
    {
    	if (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
    	{
    		return 1;
    	}
    	else
    	{
    		if (ch=='-')
    		{
    			return 2;
    		}
    		else
    		{
    			return -1;
    		}
    	}
    }

    int scan2(char ch)
    {
    	if (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
    	{
    		return 1;
    	}
    	else
    	{
    		return -1;
    	}
    }

    Here is the result:

    please input your token
    c:>abd
    abd is accepted!
    c:>a-bkdk0
    a-bkdk0 is accepted!
    c:>0ofjj
    0ofjj is rejected!
    c:>afo-b9sf
    afo-b9sf is accepted!
    c:>1-
    1- is rejected!
    c:>afgddf-
    afgddf- is rejected!
    c:>ao9-pppo0po-o
    ao9-pppo0po-o is accepted!
    c:>exit
    Press any key to continue