Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

perrien

macrumors newbie
Original poster
I'm writing a program (Cocoa, Obj-C) where I need to classify words by their part of speech. I know this probably needs to be done via enums and typedefs but am unable to figure out how to get it all working.

Where are some good examples of how they work? I'm having problems understanding the usage difference between X and Y in the following:

enum X {noun, adjective, verb} Y;

Also, "google" for instance, can be a noun or a verb, how would I set that up and test it?

partOfSpeech theWordGoogle = noun & verb;

if (theWordGoogle == noun)
// do something
if (theWordGoogle == verb)
// do something else

etc. Any pointers in the right direction would be helpful.
 
In some contexts,"Google" is a noun. In other contexts, it's a verb. So you'll need context to help you identify "Google's" part of speech. Identifying a word's part of speech can be challenging, even when you're writing in Prolog, a language designed for natural language processing.

Link is a long C program for parsing English sentences. You type a sentence, the computer parses it, and then it draws a diagram showing the part of speech of every word along with other information.

I don't mean to discourage you. But were I to write a parser, I would write it in a language for logic programming, Prolog or Mercury, say. If logic programming is new to you, you'll need to learn to think very declaratively about the problem you need to solve. The syntax of Prolog and Mercury will be strange, too, because it differs almost completely from the syntax of any C-like language.


I'll do some research because because I probably can find a program you can use as something like a design pattern.
I'm writing a program (Cocoa, Obj-C) where I need to classify words by their part of speech. I know this probably needs to be done via enums and typedefs but am unable to figure out how to get it all working.

Where are some good examples of how they work? I'm having problems understanding the usage difference between X and Y in the following:

enum X {noun, adjective, verb} Y;

Also, "google" for instance, can be a noun or a verb, how would I set that up and test it?

partOfSpeech theWordGoogle = noun & verb;

if (theWordGoogle == noun)
// do something
if (theWordGoogle == verb)
// do something else

etc. Any pointers in the right direction would be helpful.
 
I'm writing a program (Cocoa, Obj-C) where I need to classify words by their part of speech. I know this probably needs to be done via enums and typedefs but am unable to figure out how to get it all working.

Where are some good examples of how they work? I'm having problems understanding the usage difference between X and Y in the following:

enum X {noun, adjective, verb} Y;

Also, "google" for instance, can be a noun or a verb, how would I set that up and test it?

partOfSpeech theWordGoogle = noun & verb;

if (theWordGoogle == noun)
// do something
if (theWordGoogle == verb)
// do something else

etc. Any pointers in the right direction would be helpful.

I'd start by getting a good book about C.

In "enum X {noun, adjective, verb} Y;" you are declaring an enumerated type named X with three values noun = 0, adjective = 1, and verb = 2, and a variable Y of type X.

The "&" operator is a bitwise and - that won't be useful to you (again, get a good book about C). Then look at the "bitwise or" operator "|". That might come useful.
 
I don't mean to discourage you. But were I to write a parser, I would write it in a language for logic programming, Prolog or Mercury, say.

The more overriding question here is about the enum and typedef though. I am writing a parser of sorts but I'll take care of the logic and work there. Specifically I'm having questions on how typedefs and enums work, not just for this project but many others also.

I'll try and look into some C books but was hoping for some online (more correctly, free) options.
 
Here's some information about defining enumerated types in C (http://msdn.microsoft.com/en-us/library/whbyts4t(VS.80).aspx). The document says that an integer corresponds to each element of an enumerated type. Zero corresponds to the first element of that type, 1 corresponds to the second element of it, and so forth. Maybe, if you decide not to use enumerated types, you could define constants instead.

#define NOUN 'n'
#define VERB 'v'
#define ADJECTIVE 'a'
#define PREPOSITION 'p'

The more overriding question here is about the enum and typedef though. I am writing a parser of sorts but I'll take care of the logic and work there. Specifically I'm having questions on how typedefs and enums work, not just for this project but many others also.

I'll try and look into some C books but was hoping for some online (more correctly, free) options.
 
The more overriding question here is about the enum and typedef though. I am writing a parser of sorts but I'll take care of the logic and work there. Specifically I'm having questions on how typedefs and enums work, not just for this project but many others also.
Exactly what do you mean by "how typedefs and enums work"? Are you looking for an explanation of how to use them, or are you looking for an explanation of the mechanics of what the compiler is doing with them?

There are any number of C tutorials that cover typedef and enum. These would explain how to use them.

Example search terms:
C tutorial enum

Example search result:
http://crasseux.com/books/ctutorial/enum.html


For the mechanics of what the compiler is doing, I suggest starting with the language spec, because that will outline the syntax and semantics in excruciating detail. Then maybe take a look at a compiler's source.
 
The more overriding question here is about the enum and typedef though.

For the enums I would just do like this and be done with it:

Code:
enum {noun, verb, adjective};

For combinations in assignments use the bitwize or | operator as suggested, '&' might become useful if you need to query those bits later. There is plenty of more indepth information about it available on the internet and in C books.
 
Use a short int, #define some values that are powers of 2 so each value corresponds to a bit in the short. You have 16 bits with your short, so unless you go nuts with the parts of speech this should be fine. With an enum with one value that uses 0, you can't & and | things, and if you did the result wouldn't be a valid enum value. You could make the first three enum members valued at 0(for none), 1, 2, 4, for each single part of speech then build out the other permutations (2 to the power of the number of options), but it seems like a pain. I'd just use an integer type as a set of bits with #defines.

-Lee
 
That's completely true, I did sort of add the last bit after the enums. To make them work together the enums have to be in the power of 2 with 1 as the lowest legal number.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.