I mentioned some already, but to reiterate and expand.
- The grammar size. This is the complete EBNF for Oberon 07 [1]. For comparison, here is a C 2011 grammar [2]. C is quite simple to parse, but still more complex than Oberon.
- The Wirth languages can generally be compiled in a single forward pass. Dialects that allow forward references tends to require them to be specifically declared. Explicitly specified forward references minimize the amount of state the compiler needs to hold on to to fix up the typically minimal amount of references, but Oberon 07 doesn't have them anyway. This doesn't matter so much now, but in the 80's it was a big deal to be able to do single pass compilation without lots of memory spent on keeping a lot of bookkeeping or a syntax tree around (the Wirth compilers typically never constructs an AST, but directly emits opcodes during parsing by calling into a code-generation module, at the cost of losing out on quite a bit of optimization opportunities; on the other hand it also makes the compilers very simple and blazing fast).
- No preprocessor.
- In C, the presence of typedef means that there are constructs that are semantically ambiguous until you consult the symbol table (the parsers can still be context free, but you can't fully resolve the type of symbol in certain situations until you look at the symbol table). Also not a big deal, but things add up.
To be clear, C is one of the easier languages to parse. I'm not implying C is particularly complex. The verbosity of Yacc/Lex vs "straight" EBNF overstate the complexity of the C grammar somewhat. And compare it e.g. to C++ or (run...) Ruby (which I love dearly to use, but the grammar is a crime against parser writers everywhere) and it's trivial. But Oberon took it several steps further.
C is what you get if you build something through accretion and gradual changes while experimenting, despite trying to contain complexity. The result is small, but not minimal.
Meanwhile modern Oberon is what you get when you go on a 40+ year quest (even though Wirth is 82 years old, the latest revision of the Oberon 07 language report was May 3rd this year! [3]) to eliminate every unnecessary feature from an Algol-style language while adding only the bare minimum in its stead. The Oberon dialects (Oberon, Oberon-2, Oberon 07 - the latter is the newest and deriving from Oberon rather than Oberon-2) are strictly smaller languages than their by now distant ancestor in Pascal, despite being substantially more powerful.
Consider that the language report for Oberon-07 is 17 pages including the table of contents and introduction, and despite duplicating the language productions both in each chapter and in an appendix...
I prefer less austere languages these days (Ruby...), but I wish more language designers spent more time studying Wirth's work and actually paid attention to how their design affected parsing and code generation complexity.
[1] http://oberon07.com/EBNF.txt
[2] http://www.quut.com/c/ANSI-C-grammar-y.html for the Yacc grammar, and http://www.quut.com/c/ANSI-C-grammar-l-2011.html for Lex
[3] https://www.inf.ethz.ch/personal/wirth/Oberon/Oberon07.Repor...