Symbols have no length restriction. They may contain letters, numbers, dots, dollar signs, and underscores. They must start with a letter, dot, or underscore.
LWASM also supports the concept of a local symbol. A local symbol is one which contains either a "?" or a "@", which can appear anywhere in the symbol. The scope of a local symbol is determined by a number of factors. First, each included file gets its own local symbol scope. A blank line will also be considered a local scope barrier. Macros each have their own local symbol scope as well (which has a side effect that you cannot use a local symbol as an argument to a macro). There are other factors as well. In general, a local symbol is restricted to the block of code it is defined within.
By default, unless assembling to the os9 target, a "$" in the symbol will also make it local. This can be controlled by the "dollarlocal" and "nodollarlocal" pragmas. In the absence of a pragma to the contrary, for the os9 target, a "$" in the symbol will not make it considered local while for all other targets it will.